D 小H和游戏
对于被轰炸城市而言,它的孩子,孩子的孩子,父亲的父亲,父亲及父亲的孩子均受到了影响,暴力更改显然不行,不妨用标记更新,详细见代码。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=750005; 4 5 struct node 6 { 7 int to,next; 8 }edge[maxn<<1]; 9 int head[maxn<<1],cnt,f[maxn]; 10 int ans[maxn];//记录父亲或父亲的父亲的影响次数 11 int ant[maxn];//记录对孩子的影响次数 12 int knt[maxn];//距离对孩子的孩子的影响次数 13 14 void add(int from ,int to) 15 { 16 edge[++cnt].next=head[from]; 17 edge[cnt].to=to; 18 head[from]=cnt; 19 } 20 void dfs(int now,int pre) 21 { 22 f[now]=pre; 23 for(int i=head[now];~i;i=edge[i].next){ 24 int to=edge[i].to; 25 if(to==pre) continue; 26 dfs(to,now); 27 } 28 } 29 30 int main() 31 { 32 memset(head,-1,sizeof(head)); 33 memset(ans,0,sizeof(ans)); 34 int n,q,u,v; 35 scanf("%d%d",&n,&q); 36 for(int i=1;i<n;i++){ 37 scanf("%d%d",&u,&v); 38 add(u,v);add(v,u); 39 } 40 dfs(1,0); 41 while(q--){ 42 scanf("%d",&u); 43 ans[f[u]]++;ans[f[f[u]]]++; 44 ant[f[u]]++;ant[u]++; 45 knt[u]++; 46 printf("%d\n",ans[u]+ant[f[u]]+knt[f[f[u]]]); 47 } 48 return 0; 49 }
借鉴自:https://blog.csdn.net/qhq889/article/details/105534903