之前代码好像粘贴的时候挂了,现在重发一下 #include<bits/stdc++.h> #define ll long long using namespace std; struct Node{ int Dep,Id; }St[100010][20]; bool operator <(Node a,Node b){ return a.Dep<b.Dep; } int L,Lca,Now,p,q,Ans,x,Cnt,n,m,y,z,Num,Tot,Reduce; int Sum[10010],Head[10010],Next[10010],To[10010],Point[10010],Edge[10010],Fa[10010],Dep[10010],First[10010],From[10010]; template<typename T> inline int Read(T &x) { x=0; ll f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') { f=-f; } c=getchar(); } while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } x*=f; if(c=='\n') { return 1; } else { return 0; } } void Write(int x) { if(x<0) { x=-x; putchar('-'); } if(x>9) { Write(x/10); } putchar(x%10+'0'); } inline void Add(int x,int y){ To[++Cnt]=y; Next[Cnt]=Head[x]; Head[x]=Cnt; To[++Cnt]=x; Next[Cnt]=Head[y]; Head[y]=Cnt; } inline void Dfs1(int x,int f){ int y; Fa[x]=f; Dep[x]=Dep[f]+1; St[++Num][0].Dep=Dep[x]; St[Num][0].Id=x; First[x]=Num; for(int i=Head[x];i;i=Next[i]){ y=To[i]; if(y==f){ continue; } From[y]=i; Dfs1(y,x); St[++Num][0].Dep=Dep[x]; St[Num][0].Id=x; } } inline int Query(int x,int y){ Node Res; if(First[x]>First[y]){ swap(x,y); } int k=log2(First[y]-First[x]+1); Res=min(St[First[x]][k],St[First[y]-(1<<k)][k]); return Res.Id; } inline int Dfs2(int x,int f,int Dep){ int y,z,Sum; if(Dep==p){ Point[Query(x,Now)]++; return 1; } for(int i=Head[x];i;i=Next[i]){ y=To[i]; if(To[i]==f){ continue; } z=Dfs2(y,x,Dep+1); if(z){ Edge[y]+=z; Edge[y^1]+=z; Sum+=z; } } return Sum; } inline void Dfs3(int x,int f){ int y; Sum[x]=Point[x]+Sum[f]; for(int i=Head[x];i;i=Next[i]){ y=To[i]; if(y==f){ continue; } Dfs3(y,x); } } int main(){ Cnt=1; Read(n); Read(p); Read(q); for(int i=1;i<n;i++){ Read(x); Read(y); Add(x,y); } Dep[0]=0; Dfs1(1,0); for(int i=1;i<=19;i++){ for(int j=1;j+(1<<i)-1<=n;j++){ St[j][i]=min(St[j][i-1],St[j+(1<<(i-1))][i-1]); } } for(int i=1;i<=n;i++){ Now=i; Dfs2(i,0,0); } for(int i=1;i<=n;i++){ Point[i]/=2; Tot+=Point[i]; } for(int i=1;i<=Cnt;i++){ Edge[i]/=2; } Dfs3(1,0); for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ Lca=Query(i,j); L=Dep[i]+Dep[j]-Dep[Lca]*2; if(L!=q){ continue; } Reduce=Sum[i]+Sum[j]-Sum[Lca]*2+Point[Lca]+Edge[From[Lca]]; Ans+=(Tot-Reduce); } } Write(Ans); return 0; }
点赞 评论

相关推荐

牛客网
牛客企业服务