UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】

正题

题目链接:https://uoj.ac/problem/33


题目大意

给出nnn个点的一棵树

定义f(x,y)=gcd(dis(x,lca),dis(y,lca))f(x,y)=gcd(\ dis(x,lca),dis(y,lca)\ )f(x,y)=gcd( dis(x,lca),dis(y,lca) )

对于每个iii求有多少对f(x,y)=i(x<y)f(x,y)=i(x<y)f(x,y)=i(x<y)

1≤n≤1051\leq n\leq 10^51n105


解题思路

首先肯定是枚举lcalcalca节点,然后看他子树里的情况,比较麻烦的是gcdgcdgcd刚刚好是ddd,但是其实我们可以是ddd的倍数的情况,然后后面再容斥出答案。

如果,然后暴力算的话首先需要一个长链剖分,然后每次是lenloglenlen\ log\ lenlen log len的。

但是仔细想一想就会发现这个复杂度其实是假的,因为每次暴力算的话的lenlenlen是这条链上面那条链的lenlenlen

考虑点其他做法,因为是枚举倍数,我们可以上我们的根号分治

对于dis>ndis>\sqrt ndis>n的情况,我们之间暴力枚举倍数,因为这样不会超过n\sqrt nn

对于dis≤ndis\leq \sqrt ndisn的情况,我们考虑储存一些东西,设gi,jg_{i,j}gi,j表示当前的链中depdepdepiiijjj的点的个数,然后处理的时候我们就可以直接用这个来计算了。

这样平衡下来时间复杂度就是O(nn)O(n\sqrt n)O(nn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
const int N=2e5+10;
struct node{int to,next;
}a[N];
int n,T,len[N],dep[N],h[N],g[400][400];
int tot,t[N],ls[N],son[N],*f[N],*now;
long long ans[N],pre[N]; 
int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs(int x){for(int i=ls[x];i;i=a[i].next){int y=a[i].to;dep[y]=dep[x]+1;dfs(y);if(len[y]>len[son[x]])son[x]=y;}len[x]=len[son[x]]+1;return;
}
void calc(int x,int top){f[x][0]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==son[x])continue;f[y]=now;now+=len[y];calc(y,y);}if(son[x]){f[son[x]]=f[x]+1;calc(son[x],top);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==son[x])continue;for(int j=1;j<=len[y];j++)t[j]=f[y][j-1];for(int j=1;j<=len[y];j++)for(int k=2*j;k<=len[y];k+=j)t[j]+=t[k];for(int j=1;j<=len[y];j++)if(j>T){for(int k=j;k<len[x];k+=j)ans[j]+=1ll*f[x][k]*t[j];}else ans[j]+=1ll*g[j][dep[x]%j]*t[j];for(int j=1;j<=len[y];j++)f[x][j]+=f[y][j-1];for(int j=0;j<len[y];j++)for(int k=1;k<=T;k++)g[k][(j+dep[y])%k]+=f[y][j];}for(int i=1;i<=T;i++)g[i][dep[x]%i]++;if(x==top){for(int i=1;i<=T;i++)for(int j=0;j<len[x];j++)g[i][(j+dep[x])%i]=0;}return;
}
signed main()
{n=read();for(int i=2;i<=n;i++)addl(read(),i);dfs(1);T=sqrt(n);if(T>350)T=350;f[1]=now=h;now+=len[1];calc(1,1);for(int i=n;i>=1;i--)for(int j=2*i;j<=n;j+=i)ans[i]-=ans[j];for(int i=2;i<=n;i++)pre[dep[i]]++;for(int i=n;i>=1;i--)pre[i]+=pre[i+1];for(int i=1;i<n;i++)printf("%lld\n",ans[i]+pre[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces1167 E. Range Deleting(双指针)

E. Range Deleting 首先不难知道如果f(l,r)f(l,r)f(l,r)满足题意&#xff0c;那么f(l,r1),f(l,r2),…,f(l,x)f(l,r1),f(l,r2),\dots,f(l,x)f(l,r1),f(l,r2),…,f(l,x)都满足题意。 因而对于每一个左端点lll&#xff0c;需要找到最小的一个右端点rrr 单调性&#xff1a;对于每…

Redis基本使用及百亿数据量中的使用技巧分享

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9941208.html作者&#xff1a;大石头时间&#xff1a;2018-11-10 晚上20&#xff1a;00地点&#xff1a;钉钉群&#xff08;组织代码BKMV7685&#xff09;QQ群&#xff1a;1600800内容&#xff1…

Subsequence Pair

题目 题目描述 题意&#xff1a; X和Y两个字符串&#xff0c;两个字符串各取子序列X1和Y1&#xff0c;问X1<Y1的情况下X1和Y1的长度和最长是多少&#xff1f; 比如例子&#xff1a; zazxwabzczazazd abcaa 第一个字符串选取子序列为azxwabzczazazd 第二个为bcaa azxwabzc…

NOI.AC#2144-子串【SAM,倍增】

正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串sss和一个序列aaa。将字符串sss的所有本质不同子串降序排序后&#xff0c;求有多少个区间[l,r][l,r][l,r]使得子串sl,rs_{l,r}sl,r​排名等于al∼ra_{l\sim r}al∼r​的和。 1≤n≤21051\leq n\leq 2\times…

codeforces1481 E. Sorting Books(贪心+dp)

大佬题解1 大佬题解2 E. Sorting Books 首先每本书都移动&#xff0c;移动次数是n能够满足题意。如果某些书不用移动&#xff0c;说明把隔开他们中间的书全部抽走后自然成组。 对于每本书全部移动的情况&#xff0c;显然我们可以选择一种颜色的书全部不案&#xff0c;移动别…

【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

本篇将介绍如何扩展Ocelot中间件实现自定义网关&#xff0c;并使用2种不同数据库来演示Ocelot配置信息存储和动态更新功能&#xff0c;内容也是从实际设计出发来编写我们自己的中间件&#xff0c;本文内容涵盖设计思想内容和代码内容&#xff0c;我希望园友们最好跟着我这个文章…

Manacher 例题讲解

文章目录HDU 4513 吉哥系列故事——完美队形II题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3613 Best Reward题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3068 最长回文题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 5371 Hotarus problem题意&…

NOI.AC#2139-选择【斜率优化dp,树状数组】

正题 题目链接:http://noi.ac/problem/2139 题目大意 给出nnn个数字的序列aia_iai​。然后选出一个不降子序列最大化子序列的aia_iai​和减去没有任何一个数被选中的区间数量。 1≤n≤106,1≤ai≤1081\leq n\leq 10^6,1\leq a_i\leq 10^81≤n≤106,1≤ai​≤108 解题思路 嗯…

codeforces1485 E. Move and Swap(dp)

E. Move and Swap Heltion 由于红色硬币向下一层走的时候只能走儿子&#xff0c;而蓝色无限制&#xff08;对后续操作无影响&#xff09;&#xff0c;于是考虑下面表示 状态表示&#xff1a;fuf_ufu​表示当前是红色硬币&#xff0c;向下一层走后的最大价值。 状态转移&#…

一个技术管理者的苦逼【技术管理漫谈】

希望给你3-5分钟的碎片化学习&#xff0c;可能是坐地铁、等公交&#xff0c;积少成多&#xff0c;水滴石穿&#xff0c;谢谢关注。角色转变 从工程师转技术管理这两年&#xff0c;好比头马变成车夫&#xff0c;除了角色认知的转变&#xff0c;还要看方向&#xff0c;定计划。不…

KMP Trie 例题讲解

文章目录HDU 4763 Theme Section题意&#xff1a;题解&#xff1a;代码&#xff1a;POJ 3630 Phone List题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3746 Cyclic Nacklace题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 2087 剪花布条题意&#xff1a;题解&a…

P4640-[BJWC2008]王之财宝【OGF,Lucas定理】

正题 题目链接:https://www.luogu.com.cn/problem/P4640 题目大意 nnn种物品&#xff0c;其中ttt种物品是有个数限制的&#xff0c;第iii种限制为bib_ibi​&#xff0c;求选出mmm个物品的方案数%p\% p%p的值 1≤n,m,bi≤109,0≤t≤15,p∈[1,105]∩Pri1\leq n,m,b_i\leq 10^9,0…

[机器翻译]参与 Microsoft 开放源代码软件项目的方式

下面是一个事实&#xff1a;Microsoft 托管在 GitHub&#xff0c;包括.NET 编译器平台&#xff0c;也称为"Roslyn"具有多达 4 万行代码等一些相当大的大约 2,000 开放源代码软件 (OSS) 存储库。很多开发人员的代码将更改提交到数以百万计的计算机运行的项目可能会令人…

codeforces1485 F. Copy or Prefix Sum(dp)

F. Copy or Prefix Sum Venice technique简要就是懒标记思想。 由于前缀和数组和原数组一一对应&#xff0c;这里我们选择求aia_iai​的前缀和数组的方案数&#xff08;下面aia_iai​表示原题数组的前缀和&#xff09; 不难得知原题目的两个条件即 biai−ai−1→aibiai−1b_ia…

【蓝桥杯】 2018年国赛 矩阵求和

题目 题目&#xff1a; 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 n 行 n 列&#xff0c;行和列的编号都从1算起。 其中第 i 行第 j 个元素的值是 gcd(i, j)的平方&#xff0c; gcd 表示最大公…

F - GCD or MIN(数论)

F - GCD or MIN 首先gcd⁡(x,y)≤min⁡(x,y)\gcd(x,y)\leq \min(x,y)gcd(x,y)≤min(x,y) 数组中任意2个数的gcd可能是一种方案&#xff0c;任意3个数的gcd可能是一种方案… 如果我们能够把原数组任意个数的gcd全部列出来&#xff0c;能够满足题意的数一定在这些数之中&#…

P4199-万径人踪灭【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P4199 题目大意 给出一个只包含a,ba,ba,b的字符串 求有多少个不连续的回文子序列&#xff08;字母回文&#xff0c;位置对称&#xff09; 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 这个不连续一看就很nt&#xff0c;考…

被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

前天, 2018年11月10日, 广州图书馆\微软云开发者社区\广东职业教育信息化研究会\珠三角技术沙龙在广州图书馆负一层1号报告厅搞了一场”微软最有价值专家(MVP)广州分享会 - MonkeyFest 2018广州分享会”. 这是在广州图书馆官方微信公众号上的活动报名链接: https://mp.weixin.q…

[蓝桥杯][2017年第八届真题]发现环

题目链接 题目描述 小明的实验室有N台电脑&#xff0c;编号1~N。原本这N台电脑之间有N-1条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时&#xff0c;管理员误操作使得某两台电脑之间增…

P7323-[WC2021]括号路径【并查集,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出nnn个点的一张有向图。每个边(u,v,w)(u,v,w)(u,v,w)表示u−>vu->vu−>v有一个类型www的左括号边&#xff0c;v−>uv->uv−>u有一个类型www的右括号边。 求图中有多少点对满足它们之间…