D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths http://codeforces.com/problemset/problem/741/D 题意: 一棵根为1 的树,每条边上有一个字符(a-v共22种). 求每个子树内的最长的路径,使得路径上的边按照一定顺序排列后是回文串. 分析: dsu on tree.询问子树信息. 首先将这22个字符,转化为二进制.a=1,b=10,c=100...如果一条路径可以是回文串,那么…
D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths CF741D 题意: 一棵有根树,边上有字母a~v,求每个子树中最长的边,满足这个边上的所有字母重拍后可以构成回文 发明者自己出的题...orz 由于本来知道就是dsu on tree,所以还是想出来了 首先点分治是没法做了,这是有根树 写成二进制,两条链合起来构成回文\(\rightarrow\)异或和为0或者只有一位是1 一开始困惑于只处理到当前根的异或和的话,随着当前…
D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 思路: 树上启发式合并 从根节点出发到每个位置的每个字符的奇偶性记为每个位置的状态,每次统计一下每个状态的最大深度 为了保证链经过当前节点u,我们先计算每个子树的答案,再更新子树状态对深度的贡献. 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bit…
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 好像这个题只能Dsu On Tree? 有根树点分治 统计子树过x的路径 奇偶可以xor,深度可以减,所以,w[x]x到根的链上二进制数S保留字符出现奇偶性 mx[S]表示w[x]=S的x的最大深度 类比点分治去做 更新答案时候处理一个轻儿子回来更新mx[] 重儿子贡献的答案额外处理. #include<bits/stdc++.h> #define reg reg…
题目链接:Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 第一次写\(dsu\ on\ tree\),来记录一下 \(dsu\ on\ tree\)主要维护子树信息,往往可以省掉一个数据结构的启发式合并.大体思路如下: 轻重链路径剖分之后,对每个点先递归处理他的所有轻儿子,每次处理完轻儿子之后把这棵子树的信息清空.最后再来处理重孩子,重儿子的信息就可以不用清空了.由于我们是用一个全局数组来记录信息的,重儿子子树的信息就仍然保留…
codeforces 741D Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths 题意 给出一棵树,每条边上有一个字符,字符集大小只有22. 对于每一个子树,询问其中最长的,满足:路径上的字符集可以重组成字符串的路径的长度. 题解 明显是用mask维护信息,然后启发式合并一下. 一般启发式合并需要用map维护信息,这样的复杂度是log^2的.如果保留每个点重儿子的信息,就可以用全局变量维护,全局变量的大小就可以开很大,可以做到l…
[题意]给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串.n<=5*10^5. [算法]dsu on tree [题解]这题经典套路就是按照22个字母个数的奇偶性压位,然后两段路径异或起来是0或1<<j就是合法路径. dsu的时候每个点统计其子树内经过这个点的路径,注意包括从子树到该点终止的和该点自身也要算. 那么类似点分治的方式,算完重儿子后处理一下根,然后就一棵一棵轻儿子子树和之前的子树状态桶数组统计然后加入.…
题目意思很清楚了吧,那么我们从重排回文串的性质入手. 很容易得出,只要所有字符出现的次数都为偶数,或者有且只有一个字符出现为奇数就满足要求了. 然后想到什么,Hash?大可不必,可以发现字符\(\in [a,v]\),一共\(22\)种,那么我们套路的状压一下即可. 题目放在一棵树上,我们不禁联想树上常用的算法--倍增,树剖,树分治,树上莫队,LCT,但是好像都不好做. 注意到这是一个静态子树信息维护,所以我们可以用一个比较冷门的算法Dsu on Tree(中文名叫树上启发式合并) 它的大体思路…
题目链接: Codeforces741D 题目大意:给出一棵树,根为$1$,每条边有一个$a-v$的小写字母,求每个点子树中的一条最长的简单路径使得这条路径上的边上的字母重排后是一个回文串. 显然如果一条路径上的字母重排后是回文串,那么最多有一个字母有奇数个.我们用$2^{22}$的一个二进制来记录有哪些字母有奇数个.剩下的只需要$dsu\ on\ tree$来求每个点的答案即可.对于每个点记录它到根的路径上的字母的二进制状态,显然位于一个点两个不同子树中的点的状态异或起来就是这两个点间路径的二…
感觉dsu on tree一定程度上还是与点分类似的.考虑求出跨过每个点的最长满足要求的路径,再对子树内取max即可. 重排后可以变成回文串相当于出现奇数次的字母不超过1个.考虑dsu on tree,容易想到遍历时记录每种情况的最大深度,合并时类似点分的逐个计算贡献再合并即可.这里有个问题是得到某子树信息后,对于原来的根来说,这个信息还要再加上一个偏移量,但直接暴力显然复杂度就不对了.实际上维护信息过程中不断传递偏移量即可. 一开始就发现了这个题只开了256M,于是机智的开了个map,悲惨的T…