全WA求助
  • 板块P4178 Tree
  • 楼主Prean
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/7/14 23:05
  • 上次更新2023/11/6 23:07:03
查看原帖
全WA求助
160839
Prean楼主2020/7/14 23:05

刚才统计的是长度为kk的个数,现在改成了树状数组(

为什么全WA啊/kel 求助dalao/kel/kel/kel

#include<cstdio>
const int M=4e4+5,INF=0x7fffffff;
struct Edge{
    int to,val;
    Edge*nx;
}e[M<<1],*h[M],*cnt=e;
inline int max(const int a,const int b){
    return a>b?a:b;
}
inline void Add(int x,int y,int val){
    *cnt=(Edge){y,val,h[x]};h[x]=cnt++;
    *cnt=(Edge){x,val,h[y]};h[y]=cnt++;
}
int n,k,id,top,d[M],siz[M];bool vis[M];
long long ans;
int CB[20005];
inline void Modify(int a,int val){
    for(;a<=k;a+=1<<__builtin_ctz(a))CB[a]+=val;
}
inline int Query(int a){
    if(!a)return 1;
    int ans=0;
    for(;a>=1;a-=1<<__builtin_ctz(a))ans+=CB[a];
    return ans;
}
void init(int u,int f){
    siz[u]=1;
    for(Edge*E=h[u];E;E=E->nx){
        int v=E->to;
        if(v!=f&&!vis[v]){
            init(v,u);
            siz[u]+=siz[v];
        }
    }
}
int SIZ,root;
void GetRoot(int rt,int u,int f){
    int ans=0;
    for(Edge*E=h[u];E;E=E->nx){
        int v=E->to;
        if(v!=f&&!vis[v]){
            GetRoot(rt,v,u);
            ans=max(ans,siz[v]);
        }
    }
    ans=max(ans,siz[rt]-siz[u]);
    if(ans<SIZ)SIZ=ans,root=u;
}
void DFS(int u,int f,int len){
    if(len>k)return;
    ans+=Query(k-len);
    for(Edge*E=h[u];E;E=E->nx){
        int v=E->to;
        if(v!=f&&!vis[v]){
            DFS(v,u,len+E->val);
        }
    }
    d[++top]=len;
}
void Solve(int u){
    vis[u]=true;
    Edge*E;
    for(E=h[u];E;E=E->nx){
        ++id;
        if(!vis[E->to])DFS(E->to,u,E->val);
        for(;id<=top;++id)Modify(CB[d[id]],1);
    }
    for(int i=1;i<=top;++i)CB[d[i]]=0;
    id=top=0;
    for(E=h[u];E;E=E->nx){
        int v=E->to;
        if(vis[v])continue;
        SIZ=INF;
        GetRoot(v,v,0);
        init(root,0);
        Solve(root);
    }
}
signed main(){
    int i,x,y,z;
    scanf("%d",&n);
    for(i=1;i<n;++i){
        scanf("%d%d%d",&x,&y,&z);
        Add(x,y,z);
    }
    scanf("%d",&k);
    init(1,0);
    SIZ=INF;
    GetRoot(1,1,0);
    init(root,0);
    Solve(root);
    printf("%lld",ans);
}
2020/7/14 23:05
加载中...