记录编号 250773 评测结果 AAAAAAAAAA
题目名称 游戏内测 最终得分 100
用户昵称 Gravatarbhiaibogf 是否通过 通过
代码语言 C++ 运行时间 2.177 s
提交时间 2016-04-15 21:00:15 内存使用 13.66 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int,int> PII;
  5. const int MAXN=(5*1e5+5);
  6. int val[MAXN];
  7. vector<PII> f[MAXN];
  8. vector<int> g[MAXN];
  9. int read(){
  10. int r=0;char c;
  11. while(!isdigit(c=getchar()));
  12. while(r=r*10+c-'0',isdigit(c=getchar()));
  13. return r;
  14. }
  15.  
  16. bool cmp(const PII &a,const PII &b){
  17. return max(a.first,a.second+2+b.first)<max(b.first,b.second+2+a.first);
  18. }//先去a更优
  19.  
  20. void Add(){
  21. int u=read(),v=read();
  22. g[u].push_back(v);
  23. g[v].push_back(u);
  24. }void Init(){
  25. int n=read();
  26. for(int i=1;i<=n;i++) val[i]=read();
  27. for(int i=1;i<n;i++) Add();
  28. }
  29.  
  30. PII F(int u,int p){
  31. int ans=val[u];
  32. for(int i=0;i<g[u].size();i++){
  33. int v=g[u][i];
  34. if(v==p) continue;
  35. f[u].push_back(F(v,u));
  36. }
  37. if(!f[u].size()) return make_pair(ans,0);
  38. sort(f[u].begin(),f[u].end(),cmp);
  39. int d=0;
  40. for(int i=0;i<f[u].size();i++){
  41. ans=max(ans,d+f[u][i].first+1);
  42. d+=f[u][i].second+2;
  43. }
  44. return make_pair(ans,d);
  45. }
  46.  
  47. int main(){
  48. #ifdef bhiaibogf
  49. freopen("in.in","r",stdin);
  50. #else
  51. freopen("gamebeta.in","r",stdin);
  52. freopen("gamebeta.out","w",stdout);
  53. #endif
  54. int __size__ = 20 << 20; // 20MB
  55. char *__p__ = (char*)malloc(__size__) + __size__;
  56. __asm__("movl %0, %%esp\n" :: "r"(__p__));
  57. Init();
  58. PII ans=F(1,-1);
  59. printf("%d\n",max(ans.first,val[1]+ans.second));
  60. return 0;
  61. }