Codeforces 中考考完之后第一个AC,纪念一下qwq 思路 简单理解一下题之后就可以发现其实就是要求一个点,使得把它提为根之后整棵树显得非常对称. 很容易想到树哈希来判结构是否相同,而且由于只有完全对称的时候才有用,所以比普通哈希还简单一些-- 吗? 你需要求出子树哈希值.祖先哈希值,还要记下来这个点下面是否都相等,还是会有一个捣乱的,还是整个都是乱的. 然后还要特判一个儿子.两个儿子.没有儿子-- 于是开开心心地150行了,删掉缺省源之后大概100行. emmm说的好像不是很清晰,那再…
题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可以.如果不行,剩下的只可能是度为1点当根了.当然,我们不能枚举所有度为1的点,不然一个菊花图就超时了,我的做法是对于以重心为根的树搜索一遍,对于每个深度的度数为1的点只记录一个,然后枚举这些点,如果有就是有,否则没有.这样最坏的复杂度应该能到O(n * sqrt(n)),但是肯定跑不满.至于为什么这…
[codeforces 241]C. Mirror Box 试题描述 Mirror Box is a name of a popular game in the Iranian National Amusement Park (INAP). There is a wooden box, 105 cm long and 100cm high in this game. Some parts of the box's ceiling and floor are covered by mirrors.…
Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27704   Accepted: 7336 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line suc…
原文链接www.cnblogs.com/zhouzhendong/p/UOJ373.html 前言 真是一道毒瘤题.UOJ卡常毒瘤++.我卡了1.5h的常数才过QAQ Orzjry 标算居然是指数做法. 题解 1. 感受一下线图上点的含义 1.1 一阶线图 L(G) 上的一个点对应 G 中的一条边. 1.2 二阶线图 $L^2(G)$ 上一个点对应 G 中的一条包含 3 个节点的路径. 1.3 三阶线图 $L^3(G)$ 上一个点对应 G 中的一朵4个节点的菊花或者一条包含 4 个节点的路径,在…
LOJ 被一件不愉快的小事浪费了一个小时= =. 表示自己(OI方面的)智商没救了=-= 比较显然 二分+树哈希.考虑对树的括号序列进行哈希. 那么每个点的\(k\)子树的括号序列,就是一段区间去掉距离它为\(k+1\)的点的子树的区间.那么我们把每个点放到它的\(k+1\)级祖先上,在\(k+1\)级祖先处求哈希值时,跳过这个点的括号区间即可. 至于具体的哈希方式...xjb哈希就行了 //672ms 24.97M #include <cstdio> #include <cctype&…
[BZOJ5211][ZJOI2018]线图(树哈希,动态规划) 题面 BZOJ 洛谷 题解 吉老师的题目是真的神仙啊. 去年去现场这题似乎骗了\(20\)分就滚粗了? 首先\(k=2\)直接算\(k=1\)时的边数就好了.\(k=3\)同理. 这里直接计算每个点的度数就可以做,然后就有\(20\)分了. 我们发现如果企图继续考虑线图应该怎么计算出来,这里是很难做的. 注意到原图是一棵树,所以想想线图和原图之间的关系. 对于做一次线图\(L(G)\)而言,点数显然等于原图的边数. 对于做两次线图…
BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的重心最多不超过两个. 所以从两个重心分别DFS,可以将无根树转为有根树.选Hash值较小或较大的做整棵树的Hash值好了. 然后可以用树哈希,或者括号序(直接用string)来表示每棵树. 对于每个点的每棵子树,可以对哈希值或字符串sort一下用最小表示法记录. //936kb 20ms #incl…
题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #include<cstdio> #include<cstring> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar() ; while(c < '0' || c > '9')…
[BZOJ3162]独钓寒江雪(树哈希,动态规划) 题面 BZOJ 题解 忽然翻到这道题目,突然发现就是前几天一道考试题目... 题解: 树哈希,既然只考虑这一棵树,那么,如果两个点为根是同构的, 他们的重心相同,所以直接找出树的重心,以重心为根进行转移 提前预处理每一棵子树的哈希值,因为相同的子树是同构的,所以转移相当于是可重组合的计算. 对于存在两个重心的情况,分两个重心的子树同构还是不同构. 如果不同构则随便选择一个重心即可.如果同构,则建立一个虚点,然后\(dp\) 最后容斥一下即可.…