正题 题目链接:https://www.luogu.com.cn/problem/P4323 题目大意 给出\(n\)个点的树和加上一个点之后的树(编号打乱). 求多出来的是哪个点(如果有多少个就输出编号最小的). \(1\leq n\leq 10^5\) 解题思路 定义一下\(hash\)值\(P(i)\) 我的做法是\(P(i)=p^i\),\(p\)是一个质数,当然这样好像容易被卡,安全点的做法是用第\(i\)个质数或者直接用复数\(hash\). 然后定义一下带根的\(hash\)值 \…
P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达,但是通过一条高速公路需要收取一定的交通费用.小明对这个地区深入研究后,觉得这个地区的交通费用太贵.小明想彻底改造这个地区,但是由于上司给他的资源有限,因而小明现在只能对一条高速公路进行改造,改造的方式就是去掉一条高速公路,并且重新修建一条一样的高速公路(即交通费用一样),使得这个地区的两个城市…
一道比较好的树Hash的题目,提供一种不一样的Hash方法. 首先无根树的同构判断一般的做法只有树Hash,所以不会的同学可以做了Luogu P5043 [模板]树同构([BJOI2015]树的同构)再来. 首先我们直接考虑一种朴素的想法,暴力求出\(A\)树中以每一个点为根时的Hash值 然后扔到一个set(你要再写个Hash也没事)里,再在\(B\)树中枚举叶子节点,判断去掉这个叶子节点后的Hash值是否在set里即可. 发现这样算法的复杂度瓶颈在求\(A\)树Hash值时的\(O(n^2)…
传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i) #define go(u) for(int i=head[u],v=e[i].v;i;…
题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \(A,B\) ,最长直径为 \(A+B+1\) 最短为 \(\max\{A\ ,B\ ,\lceil \frac{A}{2}\rceil+\lceil \frac{B}{2} \rceil +1\}\) . 维护每个点不同子树的前3长链和向上的最长链.不同子树的前2长路径和向上子树的最长路径. 这样…
传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p]表示把根换成ppp时整棵树的答案. 于是有g[v]=f[v]+min(g[p]−min(e[i].c,f[v]),e[i].c)g[v]=f[v]+min(g[p]-min(e[i].c,f[v]),e[i].c)g[v]=f[v]+min(g[p]−min(e[i].c,f[v]),e[i].c…
https://zybuluo.com/ysner/note/1177340 题面 有一颗大小为\(n\)的树\(A\),现加上一个节点并打乱编号,形成树\(B\),询问加上的节点最后编号是多少? \(n\leq10^5\) 解析 判断树的同构显然需要树哈希. 可以先将树\(A\)中以每个节点为根的哈希值算出来存进一只\(unordered\_set\)中, 然后在树\(B\)中随便找一个不是叶节点的节点为根,枚举去掉一个叶节点,看根的\(Hash\)值是否能在\(unordered\_set\…
一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一个线段树 我们可以发现,m小的话对距离很大的路径的影响也不会超过16. 那么变化的其实就是最后4个二进制位啊. 所以我们像普通的换根dp一样求出所有距离,在额外处理一下以p为端点的全部路径里路径长度%16之后的值为k的有多少个 设为bits2[k][p] 因为换根dp的主要思路是两遍dfs,第一次处理每个…
题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \(\displaystyle \sum_{i=1}^n{\rm dist}^k(i,j)\),其中 \(\rm{dist}\) 函数表示树上两点距离. ​ \(1 \leq n \leq 50000\) ​ \(1\leq k \leq 150\) 思路 ​ 看到求答案 \(k\) 次方的问题,应该联…
题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次经过,直到无法移动则结束游戏,两人都想最大化自己的权值和减对手权值和,问先手减后手权值和最大是多少. 思路 换根\(DP\),和求树的直径有点类似. \(dp[i][j]\)表示在\(i\)这个结点状态为\(j\)时先手权值和减后手权值和最优是多少,\(j\)为偶数表示当前是先手,为奇数时为后手.…