题意:给出一棵点带权的树,求i\(\in\)[1,200000]所有路径的上点权的gcd==i的个数。

考虑点分治,对于一棵以u为根的子树,如何统计经过u的路径的答案?
显然既然是经过点u的路径,那么所有经过u的路径上的点权的gcd肯定是点u的点权的约数。
暴力算下,2e5以内最多只有160个约数。
然后dfs出u子树里所有点到u路径的gcd,然后用个桶,最多\(u的点权的约数个数^2\)数下数就行了,但是实际应该是远远不满的。
最慢的一个点1404ms,4.5s的时限应该没什么问题。
然而这题的标签里有个dp(滑稽

//by zykykyk
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define cross(i,k) for (register int i=first[k];i;i=last[i])
inline ll read(){ll x=0;int ch=getchar(),f=1;while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();if (ch=='-'){f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
const int N = 2e5+10;
int n,x,y,Size,rt,a[N];
ll ans[N];
int tot,first[N],last[N<<1],to[N<<1];
inline void Add(int x,int y){to[++tot]=y,last[tot]=first[x],first[x]=tot;}
int size[N],Max[N];
bool vis[N];
inline void GetRoot(int u,int fa){Max[u]=0,size[u]=1;cross(i,u) if (to[i]!=fa&&!vis[to[i]]) GetRoot(to[i],u),size[u]+=size[to[i]],Max[u]=max(Max[u],size[to[i]]);Max[u]=max(Max[u],Size-size[u]);if (Max[rt]>Max[u]) rt=u;
}
int cnt,g[N];
ll b[N];
inline int gcd(int a,int b){return !b?a:gcd(b,a%b);}
inline void dfs(int u,int fa,int Gcd,int x,int rt){if (x!=1||x==1&&u!=rt) g[++cnt]=Gcd,b[Gcd]++;cross(i,u) if (to[i]!=fa&&!vis[to[i]]) dfs(to[i],u,gcd(Gcd,a[to[i]]),x,rt);
}
inline void solve(int u){cnt=0,dfs(u,u,a[u],1,u),vis[u]=1;sort(g+1,g+1+cnt);int tot=unique(g+1,g+1+cnt)-g-1;For(i,1,tot){ans[g[i]]+=b[g[i]]+b[g[i]]*(b[g[i]]-1)/2;For(j,i+1,tot) ans[gcd(g[i],g[j])]+=b[g[i]]*b[g[j]];}For(i,1,tot) b[g[i]]=0;cross(k,u) if (!vis[to[k]]){cnt=0,dfs(to[k],u,gcd(a[u],a[to[k]]),0,to[k]);sort(g+1,g+1+cnt);int tot=unique(g+1,g+1+cnt)-g-1;For(i,1,tot){ans[g[i]]-=b[g[i]]*(b[g[i]]-1)/2;For(j,i+1,tot) ans[gcd(g[i],g[j])]-=b[g[i]]*b[g[j]];}For(i,1,tot) b[g[i]]=0;}cross(i,u) if (!vis[to[i]]) Size=size[to[i]],rt=0,GetRoot(to[i],u),solve(rt);
}
int main(){n=read();For(i,1,n) a[i]=read(),ans[a[i]]++;For(i,1,n-1) x=read(),y=read(),Add(x,y),Add(y,x);Size=n,Max[0]=1e9,GetRoot(1,1),solve(rt);For(i,1,N-10) if (ans[i]) printf("%d %lld\n",i,ans[i]);
}

转载于:https://www.cnblogs.com/zykykyk/p/9270572.html

Codeforces 990G 点分治+暴力相关推荐

  1. Codeforece 990G. GCD Counting(点分治+暴力)

    Codeforece 990G. GCD Counting(点分治+暴力) 题目链接:G. GCD Counting 题意: 给定一个nnn个节点的带权树,求所有点对(x,y)(x,y)(x,y)间简 ...

  2. codeforces数学1600day6[CodeForces - 1029C多区间交+枚举,CodeForces 992C[数学公式推导],CodeForces 992B[质因数分解+暴力枚举]]

    A - Maximal Intersection CodeForces - 1029C 题目大意:就是给你n个区间,这n个区间有公共的区间长度为x,现在叫你从这n个区间中删掉一个使得x最大化. 解题思 ...

  3. CodeForces - 1553E Permutation Shift(暴力+置换群求环)

    题目链接:点击查看 题目大意:假设初始时的数组为 [1,2,3,...,n][1,2,3,...,n][1,2,3,...,n],同时 kkk 为偏移量,则原数组会循环右移 kkk 个单位,假设 k= ...

  4. 浅谈根号分治——暴力的美学

    根号分治 根号分治的概念 [模板]P3396 哈希冲突 CF103D Time to Raid Cowavans 根号分治的概念 根号分治是一种优化暴力算法. 我个人的理解就是这东西跟分块差不多.但应 ...

  5. Codeforces Gym 100418K Cards 暴力打表

    Cards Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. Codeforces 993A. Two Squares(暴力求解)

    解题思路(暴力解法) 平行于x轴的正方形和与x轴成45度倾斜的正方形相交的点中必定有整数点.即若两正方形相交,必定存在整数i,j,使(i,j)同时属于两个正方形. 我们把两个正方形中的整数点都找出来, ...

  7. CodeForces - 1551F Equidistant Vertices(暴力+dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点组成的树,问选出 kkk 个节点满足相互之间距离相等的方案数有多少 题目分析:n=100n=100n=100,感觉数据范围越小的题目越难发现 ta ...

  8. CodeForces - 1311D Three Integers(暴力)

    题目链接:点击查看 题目大意:给出三个数 a , b , c ,每次操作可以挑选任意一个数让其加一或减一,现在问最少需要操作多少次,可以使得: a 可以整除 b b 可以整除 c 题目分析:乍一看是一 ...

  9. CodeForces - 1141D Colored Boots(暴力+水题)

    题目链接:点击查看 题目大意:给出两个字符串s和t,两个字符串中相同的字母可以匹配,问号可以和任意字符匹配,现在问两个字符串最多能匹配多少个字符,并给出匹配的下标 题目分析:挺好玩的一道水题,大体思路 ...

  10. Radio stations CodeForces - 762E (cdq分治)

    大意: 给定$n$个三元组$(x,r,f)$, 求所有对$(i,j)$, 满足$i<j, |f_i-f_j|\le k, min(r_i,r_j)\ge |x_i-x_j|$ 按$r$降序排, ...

最新文章

  1. 如何打造一个经常宕机的业务系统?
  2. SqlDataSource 執行資料篩選
  3. 《Python数据可视化编程实战》—— 1.6 安装图像处理工具:Python图像库(PIL)...
  4. 面试官 | count(1)、count(*) 、count(列名) 有什么区别?
  5. 《Windows驱动开发技术详解》之HelloDDK
  6. python contextlib
  7. Java基础之synchronized的讲解
  8. 设计模式之单例模式8种实现方式,其七:静态内部类
  9. 浅析基本事实表的ETL处理
  10. windows 下 vmware 安装 Mac X lion 10.7 终极教程!
  11. java 通用查询_java 通用查询
  12. 《Android Studio开发实战 从零基础到App上线》出版后记
  13. 集体智慧编程4-优化
  14. 软件测试的分类(按是否查看代码划分)
  15. 计算机语言的拼音,语言拼音_语言的拼音和组词_怎么写语言拼音
  16. 微软将要求供应商提供带薪育儿假;倪光南谈中国软件业机遇,称已出现由中方主导的开源社区...
  17. 千元4G拍照机皇 中兴红牛手机4月18号开卖
  18. 高考生男生学铁路好还是计算机好,男生学铁路什么专业好?附铁路最好的5个专业...
  19. 交房后如何在手机上办理产权证,线上办理总耗时约6天拿到证书
  20. ZZULIOJ:1008美元和人民币

热门文章

  1. Jay Simons谈Atlassian收购Trello
  2. 转换PHP脚本成为windows的执行程序
  3. ubuntu中文乱码--添加中文字符集
  4. 5.2使用select,poll
  5. MS CRM 2011实施指南5.20版已经发布
  6. rhel 5.3 nis 服务器搭建 详细(原创)
  7. Customizing AxWebBrowser, make it powerful
  8. 2019-07-11 nginx 下网页显示乱码
  9. Java集合详解2:LinkedList和Queue
  10. 洛谷 p1434 滑雪【记忆化搜索】