比赛 20161116 评测结果 AAAATTTTTT
题目名称 新型武器 最终得分 40
用户昵称 coolkid 运行时间 6.021 s
代码语言 C++ 内存使用 10.32 MiB
提交时间 2016-11-16 11:54:10
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<vector>
  6. using namespace std;
  7.  
  8. const int MAXN=300010;
  9.  
  10. struct Edge{
  11. int to,nxt;
  12. }edges[MAXN<<1];
  13. int head[MAXN],cnt=0;
  14. int val[MAXN];
  15. vector<int>p[MAXN];
  16. int dep[MAXN],n;
  17. int fa[MAXN];
  18.  
  19. void addedge(int f,int t){
  20. edges[cnt].to=t;
  21. edges[cnt].nxt=head[f];
  22. head[f]=cnt++;
  23. }
  24.  
  25. void init(){
  26. memset(fa,0,sizeof(fa));
  27. memset(head,-1,sizeof(head));
  28. scanf("%d",&n);
  29. for(int i=1;i<=n;i++) scanf("%d",&val[i]);
  30. for(int i=1;i<n;i++){
  31. int x,y;
  32. scanf("%d%d",&x,&y);
  33. addedge(x,y);
  34. addedge(y,x);
  35. }
  36. }
  37.  
  38. void dfs(int u){
  39. for(int i=head[u];~i;i=edges[i].nxt){
  40. int v=edges[i].to;
  41. if(fa[u]==v) continue;
  42. fa[v]=u;
  43. dep[v]=dep[u]+1;
  44. p[dep[v]].push_back(v);
  45. dfs(v);
  46. }
  47. }
  48.  
  49. void work(){
  50. memset(dep,0,sizeof(dep));
  51. fa[1]=0;
  52. dfs(1);
  53. int Q;
  54. scanf("%d",&Q);
  55. while(Q--){
  56. int opt;
  57. scanf("%d",&opt);
  58. if(opt==1){
  59. int u,v;
  60. scanf("%d%d",&u,&v);
  61. val[u]=v;
  62. }
  63. else{
  64. int u,c;
  65. scanf("%d%d",&u,&c);
  66. int dpt=dep[u]+c;
  67. int ans=0;
  68. for(int i=0;i<p[dpt].size();i++){
  69. int v=p[dpt][i];
  70. int F=v;
  71. while(F!=0){
  72. if(F==u){
  73. ans+=val[v];
  74. }
  75. F=fa[F];
  76. }
  77. }
  78. printf("%d\n",ans);
  79. }
  80. }
  81. }
  82.  
  83. int main(){
  84. freopen("newweapon.in","r",stdin);
  85. freopen("newweapon.out","w",stdout);
  86. init();
  87. work();
  88. return 0;
  89. }