社区讨论

最后一个 Subtask TLE 求调

P3806【模板】点分治参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mj9shcnn
此快照首次捕获于
2025/12/17 17:08
2 个月前
此快照最后确认于
2025/12/17 17:26
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e4+1,V=1e7+1;
int n,q,siz[N],f[N],maxv,rt,no[N],buc[V];
vector<pair<int,int> >e[N];
vector<pair<int,int> >queries;
vector<int>dist,alldis;
int dfs1(int u,int fa){
    f[u]=0,siz[u]=1;
    for(auto[v,w]:e[u]){
        if(v==fa||no[v])
            continue;
        siz[u]+=dfs1(v,u);
        f[u]=max(f[u],siz[v]);
    }
    return siz[u];
}
void dfs2(int u,int tot,int fa){
    f[u]=max(f[u],tot-siz[u]);
    if(f[u]>maxv)
        maxv=f[u],rt=u;
    for(auto[v,w]:e[u]){
        if(v==fa||no[v])
            continue;
        dfs2(v,tot,u);
    }
    return;
}
void dfs3(int u,int dis,int fa){
    dist.push_back(dis);
    for(auto[v,w]:e[u]){
        if(v==fa||no[v])
            continue;
        dfs3(v,dis+w,u);
    }
    return;
}
void dividetree(int u){
    maxv=0,rt=u;
    dfs2(u,dfs1(u,0),0);
    alldis.clear();
    buc[0]=1;
    alldis.push_back(0);
    for(auto[v,w]:e[rt]){
        if(no[v])
            continue;
        dist.clear();
        dfs3(v,w,rt);
        for(auto&[k,ans]:queries){
            if(ans)
                continue;
            for(auto d:dist){
                if(k<d||k-d>=V)
                    continue;
                ans|=buc[k-d];
            }
        }
        for(auto d:dist){
            if(d>=V)
                continue;
            buc[d]=1,alldis.push_back(d);
        }
    }
    for(auto d:alldis)
        buc[d]=0;
    no[rt]=1;
    for(auto[v,w]:e[rt]){
        if(no[v])
            continue;
        dividetree(v);
    }
    return;
}
int main(){
    cin>>n>>q;
    for(int i=1,u,v,w;i<n;i++){
        cin>>u>>v>>w;
        e[u].push_back({v,w}),
        e[v].push_back({u,w});
    }
    for(int i=1,val;i<=q;i++){
        cin>>val;
        queries.push_back({val,0});
    }
    dividetree(1);
    for(auto[k,ans]:queries)
        cout<<(ans?"AYE\n":"NAY\n");
    return 0;
}
不知道是不是重心找错了,也可能是被卡常了。

回复

0 条回复,欢迎继续交流。

正在加载回复...