只A了subtask3 40

P3806 【模板】点分治 1

Noah2022 @ 2024-12-11 21:52:43

为什么只 A subtask3

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
struct EDGE{
    int to,nxt,w;
}edge[maxn];
int head[maxn],cnt,n,m,u,v,w,k[maxn],root,siz[maxn],mx[maxn],vis[maxn],sum,ju[maxn],dis[maxn],ans[maxn],cl[maxn];
inline void add(register int u,register int v,register int w){
    edge[++cnt].to=v;
    edge[cnt].nxt=head[u];
    edge[cnt].w=w;
    head[u]=cnt;
}
inline void getroot(register const int &u,register const int &fa){
    siz[u]=1;
    mx[u]=0;
    for(register int i=head[u];i;i=edge[i].nxt){
        if(edge[i].to==fa)continue;
        if(vis[edge[i].to]) continue;
        getroot(edge[i].to,u);
        siz[u]+=siz[edge[i].to];
        mx[u]=max(mx[u],siz[edge[i].to]);
    }
    mx[u]=max(mx[u],sum-siz[u]);
    if(mx[u]<mx[root]){
        root=u;
        return;
    }
}
inline void getdis(register const int &id,register const int &fa){
    dis[++dis[0]]=dis[id];
    for(int i=head[id]; i; i=edge[i].nxt){
        if(edge[i].to==fa||vis[edge[i].to]!=0){
            continue;
        }
        dis[edge[i].to]=dis[id]+edge[i].w;
        getdis(edge[i].to,id);
    }
}
inline void jisuan(register const int &id){
    register int nn=0;
    for(register int i=head[id];i;i=edge[i].nxt){
        if(vis[edge[i].to]) continue;
        dis[0]=0;
        dis[edge[i].to]=edge[i].w;
        getdis(edge[i].to,id);
        for(int j=dis[0]; j; j--){
            for(int k1=1; k1<=m; k1++){
                if(k[k1]>=dis[j]){
                    ans[k1]|=ju[k[k1]-dis[j]];
                }
            }
        }
        for(int j=dis[0]; j; j--) {
            cl[++nn]=dis[j];
            ju[dis[j]]=1;
        }
    }
    for(int i=1; i<=nn;i++){
        ju[cl[i]]=0;
    }
}
inline void check(register const int &id){
    vis[id]=ju[id]=1;
    jisuan(id); 
    for(int i=head[id]; i; i=edge[i].nxt)
    {
        if(vis[edge[i].to]!=0)
        {
            continue;
        }
        sum=siz[edge[i].to]; 
        root=0;
        mx[root]=INT_MAX;
        getroot(edge[i].to,0);
        check(root);
    }
}
int main(){
    cin>>n>>m;
    for(register int i=2;i<=n;i++){
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    for(register int i=1;i<=m;i++){
        cin>>k[i];
    }
    mx[root]=n;
    sum=n;
    getroot(1,0);
    // cout<<root<<endl;
    check(root);
    for(int i=1; i<=m; i++){
        if(ans[i]!=0){
            printf("AYE\n");
        }
        else{
            printf("NAY\n");
        }
    }
}

|