比赛 20140425 评测结果 AWWWWWWW
题目名称 大话西游 最终得分 12
用户昵称 隨風巽 运行时间 0.553 s
代码语言 C++ 内存使用 10.23 MiB
提交时间 2014-04-25 11:53:41
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #define INF 200000000
  7. using namespace std;
  8. const int MAXN=100000+10;
  9. struct Edge{int u,v;}edges[MAXN];
  10. int N,Q,total=1,imp[MAXN],temp[MAXN],map[MAXN],x[MAXN],y[MAXN],I,J,P,W;
  11. //map[i]表示原树中的结点i对应的编号
  12. int mino[MAXN*8],maxo[MAXN*8],ansmin,ansmax;
  13. vector<int>g[MAXN];
  14. int min(int a,int b){return a<b?a:b;}
  15. int max(int a,int b){return a>b?a:b;}
  16. void DFS(int v,int par)
  17. {
  18. int n=g[v].size(),i,u;
  19. map[v]=total++;
  20. x[map[v]]=total-1;
  21. for(i=0;i<n;i++)
  22. {
  23. u=g[v][i];
  24. if(u!=par)DFS(u,v);
  25. }
  26. y[map[v]]=total-1;
  27. }
  28. void MAINTAIN(int v,int l,int r)
  29. {
  30. if(r-l>0)
  31. {
  32. int lc=(v<<1),rc=(v<<1|1);
  33. mino[v]=min(mino[lc],mino[rc]);
  34. maxo[v]=max(maxo[lc],maxo[rc]);
  35. }
  36. else mino[v]=maxo[v]=imp[l];
  37. }
  38. void BUILD(int v,int l,int r)
  39. {
  40. if(r-l>0)
  41. {
  42. int mid=(l+r)>>1;
  43. BUILD(v<<1,l,mid);
  44. BUILD(v<<1|1,mid+1,r);
  45. }
  46. MAINTAIN(v,l,r);
  47. }
  48. void SET(int v,int l,int r)
  49. {
  50. if(l==r)imp[P]=W;
  51. else
  52. {
  53. int mid=(l+r)>>1;
  54. if(P<=mid)SET(v<<1,l,mid);
  55. else SET(v<<1|1,mid+1,r);
  56. }
  57. MAINTAIN(v,l,r);
  58. }
  59. void QUERY(int v,int l,int r)
  60. {
  61. if(I<=l&&r<=J)
  62. {
  63. ansmin=min(ansmin,mino[v]);
  64. ansmax=max(ansmax,maxo[v]);
  65. }
  66. else
  67. {
  68. int mid=(l+r)>>1;
  69. if(I<=mid)QUERY(v<<1,l,mid);
  70. if(J>=mid+1)QUERY(v<<1|1,mid+1,r);
  71. }
  72. }
  73. int main()
  74. {
  75. freopen("westward.in","r",stdin);
  76. freopen("westward.out","w",stdout);
  77. scanf("%d%d",&N,&Q);
  78. int i,e,u,v,t,min1,min2,max1,max2;
  79. char s[10];
  80. for(i=1;i<=N;i++)
  81. scanf("%d",&temp[i]);
  82. for(i=1;i<=N-1;i++)
  83. {
  84. scanf("%d%d",&u,&v);
  85. g[u].push_back(v);g[v].push_back(u);
  86. edges[i]=(Edge){u,v};
  87. }
  88. DFS(1,-1);
  89. for(i=1;i<=N;i++)
  90. imp[map[i]]=temp[i];
  91. BUILD(1,1,N);
  92. //for(i=1;i<=N;i++)
  93. // cout<<i<<':'<<map[i]<<'('<<x[map[i]]<<','<<y[map[i]]<<')'<<endl;
  94. for(i=1;i<=Q;i++)
  95. {
  96. scanf("\n%s",&s);
  97. if(s[0]=='Q')
  98. {
  99. scanf("%d",&e);//u>v
  100. u=map[edges[e].u];v=map[edges[e].v];
  101. if(u<v){t=u;u=v;v=t;}
  102. ansmin=INF;ansmax=-INF;
  103. I=x[u];J=y[u];
  104. QUERY(1,1,N);
  105. min1=ansmin;max1=ansmax;
  106. ansmin=INF;ansmax=-INF;
  107. I=1;J=x[u]-1;
  108. if(I<=J)QUERY(1,1,N);
  109. // cout<<I<<' '<<J<<endl;
  110. I=y[u]+1;J=N;
  111. if(I<=J)QUERY(1,1,N);
  112. min2=ansmin;max2=ansmax;
  113. //cout<<I<<' '<<J<<endl;
  114. //cout<<min2<<' '<<max2<<endl;
  115. cout<<min1*max1+min2*max2<<endl;
  116. }
  117. else if(s[0]=='C')
  118. {
  119. scanf("%d%d",&P,&W);
  120. P=map[P];
  121. SET(1,1,N);
  122. }
  123. }
  124. return 0;
  125. }