[UOJ UR #2]树上GCD】的更多相关文章

来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 看完题目,一般人都能想到 容斥稳了 .这样我们只要统计有多少点对满足gcd是i的倍数. 考虑长链剖分,每次合并的时候,假设我已经求出轻儿子子树内每一个距离的点的数量,我们需要先对这个序列做一个变换,把每个数变成下标是它倍数的数的和. 然后枚举轻儿子到这个点距离dis,这样答案加上现在这棵树内已经计算的部分中 到这个点的距离是dis的倍数的数的和. 考虑分块,对于dis>=k的,暴力做.对于dis<=k的,我们顺便维护数组f[i]…
题目分析: 树上点对问题首先想到点分治.假设我们进行了点分治并递归地解决了子问题.现在我们合并问题. 我们需要找到所有经过当前重心$ c $的子树路径.第一种情况是LCA为当前重心$ c $.考虑以$ 1 $为根的$ c $的子树.那么首先在子问题中先斥掉不经过$ c $的路径.然后对于$ c $的子树处理出距离数组.用桶存储. 从大到小枚举最大公因数$ d $,求出所有距离为$ d $倍数的点的个数.然后做乘法得到$ num1 $.再考虑$ num1 $中GCD不等于$ d $的数有哪些.实际…
http://uoj.ac/problem/33 (题目链接) 题意 给出一棵${n}$个节点的有根树,${f_{u,v}=gcd(dis(u,lca(u,v)),dis(v,lca(u,v)))}$,求对于${1<=i<=n-1,}$有多少${f_{u,v}=i}$. Solution 虽然有官方题解,但是感觉写的并不是很详细→_→,不过自己推敲推敲还是能懂的.而且这道题细节也很多,膜拜了DaD3zZ大爷的代码完全弄懂.. 具体的一些实现细节就看看代码吧.(本来想详细的写写的,然而语文太差了…
正题 题目链接:https://uoj.ac/problem/33 题目大意 给出\(n\)个点的一棵树 定义\(f(x,y)=gcd(\ dis(x,lca),dis(y,lca)\ )\). 对于每个\(i\)求有多少对\(f(x,y)=i(x<y)\) \(1\leq n\leq 10^5\) 解题思路 首先肯定是枚举\(lca\)节点,然后看他子树里的情况,比较麻烦的是\(gcd\)刚刚好是\(d\),但是其实我们可以是\(d\)的倍数的情况,然后后面再容斥出答案. 如果,然后暴力算的话…
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LCA(x,y)$表示$x,y$的最近公共祖先(即树中最深的既是$v$的祖先也是$u$的祖先的结点). 对于两个结点$u,v(u≠v)(u≠v)$,令$a=LCA(u,v)$,定义$f(u,v)=gcd(d(u,a),d(v,a))$. 其中$gcd(x,y)$表示$x,y$的最大公约数,特别地,$gc…
[UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵不同的子树中选择两个点,那么贡献就是这两段的\(gcd\). 那么发现要统计的东西类似于\(u\)的子树中,深度为\(d\)的点的个数,这个可以很容易的用长链剖分来维护,那么维护出这个数组之后就可以\(O(\log {dep})\)的对于贡献进行计算.然而这个复杂度是假的,因为你每次都需要一次\(O…
题目大意:给定一棵有根树,边长均为1,对于每一个i,求树上有多少个点对,他们到lca距离的gcd是i.(n<=200,000) 做法:先容斥,求出gcd是i的倍数的点对,考虑长链剖分后从小到大合并计算答案,小的部分先把每个深度的数量变为每个深度的倍数的数量,然后若深度>k,直接到大的里面暴力,若深度<=k,我们在大的里面维护f[i][j]表示深度mod i(1<=i<=k)为j的点数,理论上k取n^0.5时达到最小复杂度O(n^1.5),实际上k比较小的时候常数较小.另外递归…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ33.html 题解 首先我们把问题转化成处理一个数组 ans ,其中 ans[i] 表示 d(u,a) 和 d(v,a) 同时为 i 的倍数的 (u,v) 个数.(最后求答案的时候只要莫比乌斯反演回来就好了.) 注意一下我的代码中对于 (u,v) 有祖先关系的是分开考虑的. 先点分治. 对于一个点分中心 x ,我们把答案分两部分考虑. 1. 在子树 x 中满足 LCA(u,v) = x 的 (u,v)…
这道题是有根树点分治+烧脑的容斥+神奇的分块 因为是规定1为根,还要求LCA,所以我们不能像在无根树上那样随便浪了,必须规定父亲,并作特殊讨论 因为gcd并不好求,所以我们用容斥转化一下,求x为gcd的因数的个数,这样就可以随便统计了,个人觉得代码比题解要好懂. 又因为统计完重心的所有子树,还有重心的父亲,所以在这个分治块内沿着重心的父亲一路向上爬,这时候重心的子树到重心的父亲的距离是变的,所以我们用神奇的分块大法,分类讨论,$≤\sqrt{n}$使用数组记录答案,方便以后再用到的时候统计,$>…
题目 大致是长剖+\(\rm dsu\ on\ tree\)的思想 先做一个转化,改为对于\(i\in[1,n-1]\)求出有多少个\(f(u,v)\)满足\(i|f(u,v)\),这样我们最后再做一个反演就好了 既然我们要求有多少对\(f(u,v)\)是\(i\)或\(i\)的倍数,我们需要在长剖的时候快速合并两边的信息,这个信息长得非常别致,形如到当前节点距离为\(i\)或\(i\)的倍数的节点个数 轻儿子这边还好说,我们直接暴力调和级数处理一下即可,但是这样的信息从中儿子哪里却非常不好继承…
UOJ 58 糖果公园 Problem : 给一棵n个点的树,每个点上有一种颜色,对于一条路径上的点,若 i 颜色第 j 次出现对该路径权值的贡献为 w[i] * c[j], 每次询问一条路径的权值,或者修改某个点的颜色. Solution : 树上的带修改的莫队. 使用dfs序来对左右端点进行分块. 第一关键字分块排序左端点,第二关键字分块排序右端点,第三关键字排序询问顺序. 用S(v, u)代表 v到u的路径上的结点的集合. 用root来代表根结点,用lca(v, u)来代表v.u的最近公共…
一个显然的结论是最终树的形态必然是一条链.具体证明只要考虑选定树上的某一条链,然后把其他部分全部接在它后面,这样答案一定不会变劣. 那么,一开始的想法是考虑每一位的最后出现位置,但这并不容易实现.注意到最终序列是单调递减的.我们在统计答案之前,把公共位先统计掉,即始终都是1的位.这样,剩下的位的最终结果都是0.这样,我们就避免了在统计时忽略某些数.那么,我们记dp[i]表示当前的结果为i的最小费用.我们在转移时枚举下一个数字是什么.这里无需担心数字的重复放置,因为它并不能让当前的数字发生变化.那…
题目链接 题意 给定一棵根为\(1\)的树.定义每个点的美丽值为根节点到它的路径上所有点的\(gcd\)值.但是对于每个点,在计算它的美丽值时,可以将这条路径上某个点的值变为\(0\)来最大化它的美丽值.现问每个点的美丽值最大是多少. 注意,每个点的美丽值计算是独立的,即每次可以选择变为\(0\)的点可以是不同的. 思路 对于某一条路径,考虑上面变化的点. 如果变为\(0\)的是, 根节点 那么可以直接一路往下ans0[v]=gcd(ans0[u],val[v]);(\(u\)是\(v\)的父亲…
题意:给你一棵树,根节点为1,每条边长度为1.定义f(u,v)=gcd(u-lca(u,v),lca(u,v)-v),求有多少个无序点对f(u,v)=i.对每个i输出答案. n<=20W. 标程: #include<cstdio> #include<algorithm> #include<vector> using namespace std; typedef long long ll; ; int n,fa[N],f[N],g[N],sum[N],jp[N],d…
来自FallDream的博客,未经允许,请勿转载, 谢谢. 传送门 考虑直接维护一个堆,然后往里面丢链,并且取出k个堆顶就行了. 然后就需要分类讨论啥的,给你的三个点变成两条链,每次取出一条链之后选择权值最小的再劈成两条链丢进去. 卡空间  所以树剖,不选择倍增 复杂度O((n+k)logn) #include<iostream> #include<cstdio> #include<queue> #define MN 500000 #define N 524288 #d…
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 先考虑n是奇数的情况,很容易想到一个dp,f[i][0/1]表示转移到第i个数,第i个数是不是第一个数的方案数,然后用矩阵乘法优化一下就好了. 然后考虑n是偶数的情况,发现可以把圈分成两个半圆,dp就多了几维,需要表示两个数分别是是第一个数/第二个数/都不是的方案数. #include<iostream> #include<cstring> #include<cstdio> #define MN 10 #…
题目传送门 题目大意大概就是给你一个混合图(既有有向边又有无向边),对于每条无向边,u-v,问删去u->v,或删去v->u那条可以使新图强连通.(保证数据有解). 这道题前几个数据点送分. 枚举每一条边,先将它去掉,遍历图,如果可以达到所有点,即强连通. 比如去掉u->v,其实只要dfs(u),判断是否能到达v即可.可以直接删去,否则删另一条边,删去后因为图强连通,所以对之后的操作无影响. code: #include <cstdio> #include <cstrin…
#22. [UR #1]外星人 一开始随便搞出第一问答案,很显然的性质对$x$有变化的$a$一定是递减的,就拿一个桶直接记录可以达到的值 然后我开始想第二问,一开始想直接在这个桶上统计答案,然后发现不行,之后再想,如果利用上面的性质,在选取了一个$a_i \leq x$时,会有一段区间的$a$可以随便插入到$a_i$之后,然后就被一些组合数学的细节绕晕,没有想清楚,这一段区间是$(x \mod a_i,x]$,并且要在$a_i$中挑一个出来放在最前面,然后会发现$x \mod a_i$是一个子问…
Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩. 糖果公园的结构十分奇特,它由 nn 个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为 11 至 nn.有 n−1n−1 条双向道路连接着这些游览点,并且整个糖果公园都是连通的,即从任何一个游览点出发都可以通过这些道路到达公园里的所有其它游览点. 糖果公园所发放的糖果种类非常丰富,总共 mm 种,它们的编号依次为 11 至 mm.每一个…
题目:https://vjudge.net/contest/307753#problem/J 题意:一棵树,每个点都有个权值,现在问你,树上gcd每个不同的数有多少个 思路:点分治,首先范围只有 1e5,然后我们记录一条路径的gcd,我们在重心确定后找路径,每到gcd一个数,这条路径必然是父亲节点的因子,一个数的因子不同的个数很少,其实就相当于是几个数的不同因子数,所以gcd路径不同的个数肯定很少,我们就可以在遍历子树的时候直接暴力之前出现过的路径值了,复杂度 应该是 O(n*logn*logn…
题目 低智选手果然刷不动uoj 首先考虑一下构造一棵树显然是骗你玩的,按位与这个东西越做越小,挂到链的最下面显然不会劣于挂到之前的某一个点下面,所以我们只需要求一个排列使得答案最小就好了 设\(A=\max(a_i)\),发现最优答案不可能要劣于反复对一个数取\(\rm and\)的答案,我们就有了一个\(O(nA)\)的暴力,设\(dp_i\)表示当前的\(\rm and\)和为\(i\),把这个\(i\)变成\(0\)的最小代价 但是有可能最后的\(\rm and\)和也不是\(0\),于是…
原文链接www.cnblogs.com/zhouzhendong/p/UOJ370.html 题解 首先易知答案肯定是一条链,因为挂在链的最下面肯定比挂在其他节点上赚. 问题被转化成了从一个集合中不断选数加入到当前序列尾端,使得序列的所有前缀 AND 之和最小. 我们发现,假如加入一个数后可以使序列的 AND 值变小,那么必然不会去加一个使 AND 值不变的. 假设 $v = a_1\ {\rm and} \ a_2 \ {\rm and}\ \cdots \ {\rm and}\ a_n$,先…
$n \leq 1e5$个点,每个点有个权值$a_i \leq 2e5$.现将点连成树,每个点$i$的链接代价为$a_i \ \ and \ \ i父亲的代价$,这里的$and$是二进制按位与,求最小总代价. 日常被坑... 首先肯定是要把这些点连成一条链,尽量使得代价andand就and成0了.然后呢... 方法一:贪心,从小到大排.错误! 5 56499 113007 129845 126701 56282 一组错误数据. 方法二:这个想法还是可以有的,俗话说,贪心不成就DP.看一下那些二进…
[UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1}^n gcd(i,j)^{c-d}i^dj^dx_j\equiv b_i\] 于是我们就可以写成函数的形式: \[\sum_{j=1}^n f(gcd(i,j))h(i)h(j)x_j\equiv b_i\] 然后就开始枚举\(gcd\). \[\begin{aligned} b_i&=\sum_{…
[UOJ#48][UR #3]核聚变反应强度(质因数分解) 题面 UOJ 题解 答案一定是\(gcd\)除掉\(gcd\)的最小质因子. 而\(gcd\)的最小值因子一定是\(a_1\)的质因子. 所以预处理出\(a_1\)的质因子,个数不会超过\(\log(a)\)个,然后就可以直接暴力了. 时间复杂度\(O(n\log(a)+\sqrt a)\) #include<iostream> #include<cstdio> #include<algorithm> usin…
#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description 高中,高中,短暂的三年.NOI是高中结业考试,而高考在每年暑假举行. 高二暑假,这是你最后一次参加高考的机会.你已经为了高考停课很久了,OI的知识很久没管了.你并没有能力用一年时间补起别人三年的OI课程.这是你的最后一战,如果你失败了,可能就不能工地搬砖只能去清华了. 这天你背上行囊赴京赶考.此时…
#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Description 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT.仙人掌之类…
UOJ 241. [UR #16]破坏发射台 题意:长度为 n 的环,每个点染色,有 m 种颜色,要求相邻相对不能同色,求方案数.(定义两个点相对为去掉这两个点后环能被分成相同大小的两段) 只想到一个奇怪的线性递推,无法写成矩乘的形式... 正解用状态记录了颜色是否相同 奇环,只考虑相邻,确定第一个的颜色,\(f[i][0/1]\)表示i个与第一个不同/同色的方案数 偶环,再考虑相对,分成两段,同时递推\(i,\frac{n}{2}+i\),\(f[i][0..6]\)来表示 构造矩阵讨论好烦啊…
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 $n$ 个节点.有 $m$ 种颜色,第 $i$ 个节点的颜色为 $c_i$ . 给定参数 $v_{1},v_2,\cdots,v_m$ 和 $w_1,w_2,\cdots ,w_n$ ,具有以下意义: 第 $i$ 次遇到颜色为 $j$ 的节点,新得到的收益为 $v_{j}\times w_i$ .…
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i)\)的和,所以我们尝试通过反演将\(x(i)\)表达成一系列\(b(i)\)的和的形式,那么就可以解出来了. 然后一个简单的化简:\(gcd(i,j)^c\cdot lcm(i,j)^d=i^d\cdot j^d\cdot gcd(i,j)c-d\). \[ \displaystyle b_i=\…