树上的路径统计问题。树的点分治。

Implementation

#include <bits/stdc++.h>
using namespace std;const int N=1e5+5;
int a[N];
vector<int> g[N];
int size[N];
bool removed[N];pair<int,int> centroid(int u, int f, const int &tot){size[u]=1;pair<int,int> res={INT_MAX, 0};int ma=0; // the max size of connected components after deleting ufor(auto v: g[u]){if(v!=f && !removed[v]){res=min(res, centroid(v, u, tot));size[u]+=size[v];ma=max(ma, size[v]);}}ma=max(ma, tot-size[u]);return min(res, {ma, u}); // error-prone
}map<int,long long> res;
unordered_map<int,int> sum, tmp;void dfs(int u, int f, int gcd){res[gcd]++;tmp[gcd]++;for(auto v: g[u])if(v!=f && !removed[v])dfs(v, u, __gcd(gcd, a[v]));
}void DC(int u, int n){int root=centroid(u, u, n).second;removed[root]=true;res[a[root]]++;sum.clear();    // error-pronefor(auto v: g[root])    //error-proneif(!removed[v]){tmp.clear();dfs(v, root, __gcd(a[root], a[v]));for(auto x: tmp){for(auto y: sum)res[__gcd(x.first, y.first)]+=(long long)x.second*y.second;// sum[x.first]+=x.second; // !error}for(auto x: tmp)sum[x.first]+=x.second;}for(auto v: g[root]){if(!removed[v]){int tot=size[v]<size[root]?size[v]:n-size[root]; // 这种写法比较繁琐DC(v, tot);}}}int main(){int n;scanf("%d", &n);for(int i=1; i<=n; i++)scanf("%d", a+i);for(int i=1; i<n; i++){int u, v;scanf("%d%d", &u, &v);g[u].push_back(v);g[v].push_back(u);}DC(1, n);for(auto x: res)printf("%d %lld\n", x.first, x.second);return 0;
}

点分治的实现细节

  1. 求重心时需要把连通块(子树)的大小作为参数。
  2. 【统计包含根节点(重心)的路径】必须在【递归处理子树】之前进行。由于删点标记是在递归之前打上的,【递归处理子树】后,各子树(即删除重心后所剩的个各连通块)就被破坏了。

转载于:https://www.cnblogs.com/Patt/p/6398051.html

hihoCoder #1073 光棍节相关推荐

  1. 光棍节程序员闯关秀(总共10关)

    程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/ha ...

  2. 光棍节,猪我生日快乐!

    不是光棍,却比光棍更爱过光棍节,无它,因为这天是俺生日!

  3. 祝所有51cto的朋友光棍节快乐

    又是一年一度的光棍节,也不知道是谁发明的这个破节日,想想以前在学校里面没到今天的晚上就是一群哥们出去喝酒,其实大部分都不是光棍也来凑热闹.现在已经没有那样的机会了,祝各位51cto的朋友节日快乐,光棍 ...

  4. FW : 关于光棍节

    中央关于庆祝光棍节的文件 致所有未婚的同学:     群中央,群务院:     我们正处于结婚时代的初级阶段,经过二十几年的努力,虽然取得了结识众多异性的巨大成就,但是人口众多,人均资源相对短缺,局部 ...

  5. 《光棍节程序员闯关秀》闯关攻略

              https://1111.segmentfault.com<光棍节程序员闯关秀>        程序员们,欢迎来攻!!! 在之前的基础上,重新整理了一遍,之前才闯到第8 ...

  6. [2017.11.11特辑]以一个光棍节表白案例浅谈ECMAScript6模块化的使用方法

    双十一,购物节与光棍节,在这个特殊的日子里研究了一下模块化开发的我,突然想结合这个日子,以一个表白的例子浅谈es6模块化的用法. 在之前的 javascript 中一直是没有模块系统的,随着JavaS ...

  7. 11-11 又是一年光棍节!

    11月11日,光棍节,没有哪一天比这一天更形象.更贴切了.当光棍成了"光贵",王老五也有了黄金级和钻石级之分的今天,"光棍节"自然而然地流行开来."光 ...

  8. 光棍节程序员闯关秀过关全攻略

    maven/java/web/bootstrapQQ群:566862629.希望更多人一起帮助我学习. 光棍节程序员闯关秀过关全攻略.程序员的寂寞谁能懂?"SF光棍节程序员闯关秀" ...

  9. 光棍节的快乐 NYOJ 451

    #include<stdio.h>//光棍节的快乐(451) long long f(int x) {long long res=1,i;for(i=1;i<=x;i++){res= ...

最新文章

  1. iTunes 降级安装 12.6
  2. Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等
  3. 《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一1.2.2 团队组建...
  4. Virut样本取证特征
  5. 概率论和数理统计 - 03 - 多维随机变量及其分布
  6. apache配置文件httpd.conf部分参数说明
  7. javascript动态修改对象的属性名
  8. Ubuntu16.04.1安装Caffe(GPU)
  9. android 饿了么地图,饿了么送餐位置地图定位代码
  10. 使用maven在netbeans下构建wicket项目
  11. python traceback报错_Python traceback.print_exc()返回’None’
  12. “钱景”没了?莫慌,内容创业还有七大红利
  13. 设计原则-依赖倒置原则
  14. 新形势下安全风险评估实践
  15. 超全装饰 陈设ps后期素材素材网站整理
  16. 程序员五一被拉去相亲,结果彻底搞懂了HTTP常用状态码
  17. CSDN日报190219——表面上又佛又丧,背地里天天向上,算是看透你们了
  18. Matlab eval用法
  19. Linux上烧录CD
  20. Django删除数据表后,再重新生成新数据表

热门文章

  1. Linux嵌入式开发——vim编辑器
  2. PHP在线发邮件 无需服务端软件
  3. 微信小程序实例:image组件的binderror事件处理
  4. tomcat配置pid文件
  5. 展会圆满收官 柏克利招商峰会业绩闪亮
  6. python协程和网易云歌单
  7. 晶体谐振器和晶体振荡器
  8. 数据可视化之Seaborn绘图
  9. 武汉大学计算机学院辅导员,武汉大学2021年辅导员拟录名单出炉,多数为名校博士毕业生...
  10. Chrome网页翻译插件,实测超好用,万物皆可译