总所周知,动漫《海贼王》里有许多大海贼团,他们每个人都在海上有一定的领地。今天世界政府想要评估一下当下海贼的势力值。为了简化计算,做如下设定,每个海贼团作为一个节点,单个海贼团有其威望值 ai,当其作为整个海贼组织的领袖——海贼王时,对于海上的海贼势力值计算为 其中 v 表示当选海贼王的海贼团,dist(i, v) 在海上 i 海贼团距离当前 v 海贼团的距离,其中这里的距离规定如果两个海贼团相连且有海路,则这两个海贼团之间距离为 1。任意两个海贼团之间只有一条通路。所以请你当下政府计算下所需要面对的海贼最大势力值为多少。

输入
第一行输入一个数 n (1≤n≤2×10^5),表示当下海贼团数量。 第二行输入 n 个数字 ai (1≤ai≤5×10^5) 表示每个海贼团的威望值。 接下来的 n−1 行,每行输入 u, v (1≤u, v≤n) u, v 不同,表示 u, v 两个海贼团之间有一条海路。

输出
输出当下海贼最大势力值。

样例
输入
9 4 1 7 10 1 6 5
1 2
2 3
1 4
1 5
5 6
5 7
5 8
输出
121
提示
对于 50% 数据 ,1≤n≤10000, 1≤ai≤5×10^5 对于 100% 数据,1≤n≤2×10^5, 1≤ai≤5×10^5

来源
2021年CCF线上测试

AC code:

#include<bits/stdc++.h>
using namespace std;int head[200005],cnt = 0;
long long t[200005],a[200005];
int n,q;
bool vis[200005];
long long mx = 0;struct Edge{int to,next;//to:边指向的结点 next:下一个边的编号;
}e[400005];void add_edge(int u,int v){e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
}long long dfs1(int x,int dep){long long sum = 0;vis[x] = true;for(int i = head[x]; i != -1; i = e[i].next){if(!vis[e[i].to]){sum += dfs1(e[i].to,dep+1);t[x] += t[e[i].to];}}sum += a[x]*dep;t[x] += a[x];return sum;
}void dfs2(int x, long long sum){vis[x] = true;for(int i = head[x]; i != -1; i = e[i].next){if(!vis[e[i].to]){ //计算以so为海贼王势力值 long long sum1 = sum,tmp;sum1 += t[x] - 2*t[e[i].to];tmp = t[e[i].to];t[e[i].to] = t[x];t[x] = t[e[i].to] - tmp;mx = max(mx,sum1);//此时要更新t[x] t[so] 为下一层做准备 dfs2(e[i].to,sum1);t[e[i].to] = tmp;t[x] += tmp;}}return;
}int main(void){cin >> n;for(int i=1;i<=n;i++){scanf("%lld",&a[i]);head[i]=-1;}for(int i=1; i<=n-1; i++){int u,v;cin >> u >> v; add_edge(u,v);add_edge(v,u);}long long ans1 = dfs1(1,0);memset(vis,false,sizeof(vis));dfs2(1,ans1);cout << mx;return 0;
}

海贼王(pirate)(LCA)相关推荐

  1. 【luogu3398】 仓鼠找sugar [LCA 倍增]

    P3398 仓鼠找sugar 长期不学竞赛...导致1mol的低级错误出现 把f数组开为f[N][20] 写错判断 我烂了QAQ我好瘟死于低级错误久久无法判断出来 如果两条路径相交,那么一定有一条路径 ...

  2. [BZOJ1602] [Usaco2008 Oct] 牧场行走 (LCA)

    Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走, ...

  3. POJ - 3694 Network tanjar割边+lca

    题目链接 思路:跑一边tanjar将所有的割边u->v标记为cut[v]=true,表示u->v这条边为割边.然后记录总的割边数ans,每次从两个询问点暴力往上边在跑直到LCA,如果碰到c ...

  4. The Shortest Statement CodeForces - 1051F LCA+最短路

    太弱了... 一开始看到题感觉是跑一个最小生成树在上边进行LCA就行了,但是发现过不了样例,然后就是就想到了之前做过类似做法的题目,就是非生成树上的边最多只有21条,然后就那些边记录下来,通过每一条边 ...

  5. A and B and Lecture Rooms CodeForces - 519E LCA+dfs序

    看到这个题的第一个思路就是就是统计以每一个点为根的所有节点个数,然后具体就分情况讨论一下即可. 因为刚刚学习了dfs序,这个题就用了dfs序来通过进出时间戳来相减表示其为根的子节点个数. 分情况 我们 ...

  6. POJ - 3417 Network LCA+树上差分

    思路:首先来说,给一个树加一条边肯定要构成一个环,我们假设加了该边后产生的环上的每一条边都累计加一. 假设这条边是a到b,那么其实就是原树a->lca(a,b)到b->lca(a,b)上的 ...

  7. POJ - 2763 Housewife Wind LCA+dfs序+线段树

    q次询问求两个点之间的距离,并且可以随时修改某条边的长度,最短距离可以用lca来求,但是树上维护每一个点到root的距离必须要用dfs序来记录时间戳,在dfs的时候顺便记录每一条边(u,v)对应的v节 ...

  8. HDU - 3078 Network 倍增LCA

    倍增lca,把路径上点全部拉出来拍个序输出第k大就过了. 不知道怎么过的,咱也不敢问. #include<stdio.h> #include<string.h> #includ ...

  9. POJ - 1986 Distance Queries 倍增求LCA

    题意还是很有病的,说了半天后边的方向都没用的,意思就是跟样例一样求两点间的距离,裸的LCA 两个点x,y的距离=dis[x]+dis[y]-2*dis[LCA(x,y)]; 三个点x,y,z的距离=d ...

  10. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

最新文章

  1. 强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例----Sarsa算法, Q学习, 期望Sarsa算法
  2. SpringMvc-Httl-shiro的整合
  3. Visual Studio Code之常备快捷键
  4. stm32的can总线理解及应用——程序对应stm32f103系列
  5. druid 多数据源_Druid连接池的使用以及注意事项
  6. PostgreSQL数据类型-枚举类型、几何类型、网络地址类型和其他数据类型
  7. pc计算机中ram的编址单位,字母编址
  8. mathematica 下载安装注册激活大本营
  9. 万人攻防大战:淘宝优惠活动,沦为黑产盛宴
  10. Linux下Socket编程的端口问题( Bind error: Address already in use )
  11. LintCode炼码刷题实操平台
  12. 华为路由器OSPF配置
  13. FastDFS安装手册
  14. 恢复svn服务器误删的文件,SVN删除文件及其恢复问题详解
  15. Git 之 多人协同开发工作流
  16. 更改桌面壁纸_使用DeskSlide轻松更改桌面墙纸
  17. 排序算法总结(Python实现)——(一)
  18. 可视化接口管理平台 YApi,让你轻松搞定 API 的管理问题
  19. 音乐播放器微信小程序开发-歌单界面(简陋版)
  20. Idea注释输入中文,显示为日文

热门文章

  1. 揭秘阿里CDN核心技术(http://wenku.baidu.com/view/ffc63474b4daa58da1114a45.html?re=view)
  2. douban movie top of Web Crawler
  3. 青春树儿童摄影网网页
  4. 疯狂的二手电商:爱回收偷食闲鱼、转转
  5. 为什么编c语言总有一个错误,为什么程序最后总会显示有1个错误
  6. 梅花易数的数学研究与编程
  7. 删除后别人的微信号变成wxid_腾讯开放微信号修改,一年一次,方法简单
  8. Linux下使用icq(转)
  9. MySQL技能树学习总结
  10. 学习C C++的必备技能(1)