【DSU on tree】【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
Description
给定一棵 \(n\) 个节点的树,每条边上有一个字符,字符集大小 \(22\),求每个节点的子树内最长的简单路径使得路径上的字符经过重排后构成回文串。
Limitation
\(1~\leq~n~\leq~500000,~\text{字符集}~=~['a',~'v']\)
Solution
考虑一条路径能构成回文串当且仅当路径上的字符出现奇数次的至多为一个。由于字符集大小很小,我们考虑状态压缩,即每个字符对应二进制位上的一个 \(1\)。考虑从每个点出发向下走,显然链长越深越好。于是我们对每个节点 \(u\) 的每个状态 \(S\) 维护从点 \(u\) 出发向下走路径状态为 \(S\) 的终点的最大深度。该点的答案易于求得,即为所有异或起来至多有一个 \(1\) 的状态组深度和减去两倍的该点深度。
考虑树上静态链分治(这是 lxl 的叫法,普遍叫法好像叫 DSU on tree),只用一个 \(f\) 数组维护全局信息
先进行轻重链剖分。考虑dfs的时候先递归轻儿子,递归结束后清空 \(f\) 数组,然后递归重儿子,递归结束后不清空 \(f\) 数组,枚举轻儿子的子树,将子树的信息加入 \(f\) 数组即可。考虑复杂度:每个节点的信息每次经过合并会增大一倍,于是复杂度 \(O(n~\log n)\)。
事实上链分治的的流程为:
递归轻儿子,清空数据结构
递归重儿子,不清空数据结构
向数据结构中加入轻儿子及其子树的信息
Code
#include <cstdio>
#include <vector>
#include <algorithm>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endif
typedef long long int ll;
namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
}
template <typename T>
inline void qr(T &x) {
char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
}
namespace OPT {
char buf[120];
}
template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
int top=0;
do {OPT::buf[++top] = static_cast<char>(x % 10 + '0');} while (x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
}
const int maxn = 500010;
const int upceil = 1 << 22;
int n, vistime;
int fa[maxn], ans[maxn], MU[maxn], son[maxn], sz[maxn], hash[maxn], frog[upceil], deepth[maxn], dfn[maxn], st[maxn], ed[maxn];
std::vector<int>sons[maxn];
std::vector<char>s[maxn];
void DFS(int);
void dfs(int, bool);
int main() {
freopen("1.in", "r", stdin);
qr(n);
for (int i = 2; i <= n; ++i) {
qr(fa[i]); int &ch = MU[i]; do ch = IPT::GetChar(); while ((ch > 'v') || (ch < 'a')); ch = 1 << (ch - 'a');
sons[fa[i]].push_back(i);
}
deepth[1] = 1; DFS(1); dfs(1, true);
for (int i = 1; i <= n; ++i) qw(ans[i], ' ', true);
putchar('\n');
return 0;
}
void DFS(int u) {
sz[u] = 1; dfn[st[u] = ++vistime] = u;
for (auto to : sons[u]) {
hash[to] = hash[u] ^ MU[to]; deepth[to] = deepth[u] + 1; DFS(to);
if (sz[to] > sz[son[u]]) son[u] = to;
sz[u] += sz[to];
} ed[u] = vistime;
}
void dfs(int u, bool rec) {
if (!son[u]) {if (rec) frog[hash[u]] = std::max(frog[hash[u]], deepth[u]); return;}
for (auto to : sons[u]) {
if (to == son[u]) continue;
dfs(to, false);
ans[u] = std::max(ans[u], ans[to]);
}
dfs(son[u], true); ans[u] = std::max(ans[u], ans[son[u]]);
ans[u] = std::max(ans[u], frog[hash[u]] - deepth[u]);
for (int i = 1; i != upceil; i <<= 1) ans[u] = std::max(ans[u], frog[i ^ hash[u]] - deepth[u]);
int dep = deepth[u] << 1;
frog[hash[u]] = std::max(frog[hash[u]], deepth[u]);
for (auto to : sons[u]) {
if (to == son[u]) continue;
for (int i = st[to]; i <= ed[to]; ++i) {
int v = dfn[i], w = hash[v];
if (frog[w]) ans[u] = std::max(ans[u], frog[w] + deepth[v] - dep);
for (int j = 1; j != upceil; j <<= 1) {
if (frog[w ^ j]) ans[u] = std::max(ans[u], frog[w ^ j] + deepth[v] - dep);
}
}
for (int i = st[to]; i <= ed[to]; ++i) {
frog[hash[dfn[i]]] = std::max(frog[hash[dfn[i]]], deepth[dfn[i]]);
}
}
if (!rec) for (int i = st[u]; i <= ed[u]; ++i) frog[hash[dfn[i]]] = 0;
}
【DSU on tree】【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths的更多相关文章
- 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
[UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...
- 【POJ3237】【树链剖分】Tree
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- 【BZOJ4736】温暖会指引我们前行(Link-Cut Tree)
[BZOJ4736]温暖会指引我们前行(Link-Cut Tree) ##题面 神TM题面是UOJ的 题解 LCT傻逼维护最大生成树 不会的可以去做一做魔法森林 #include<iostrea ...
- 【BZOJ3626】LCA(树链剖分,Link-Cut Tree)
[BZOJ3626]LCA(树链剖分,Link-Cut Tree) 题面 Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. ...
- 【BZOJ4825】【HNOI2017】单旋(Link-Cut Tree)
[BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有 ...
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...
- 【BZOJ2816】【ZJOI2012】网络(Link-Cut Tree)
[BZOJ2816][ZJOI2012]网络(Link-Cut Tree) 题面 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相 ...
- 【BZOJ2157】旅游(树链剖分,Link-Cut Tree)
[BZOJ2157]旅游(树链剖分,Link-Cut Tree) 题面 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥 ...
- 【BZOJ3669】【Noi2014】魔法森林(Link-Cut Tree)
[BZOJ3669][Noi2014]魔法森林(Link-Cut Tree) 题面 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n ...
- 【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
随机推荐
- 从零开始的Python学习Episode 18——面向对象(1)
类与对象 类即类别.种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体. 类的定义 class 类名: 属性1 属性2 def 方法(self,ar ...
- 理解粒子滤波(particle filter)
1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...
- 凡事不求甚解,遇事必定抓瞎——PHP开发Apache服务器配置备忘录
照此配置流程,绝对一路畅通,可保无虞. 昨天弄了个PHP小程序,想在本地跑一下测试,可是工作电脑没有安装环境,于是下载了一个wamp,一路畅通,Apache.Mysql.PHP就全有了.启动wamp服 ...
- Beta阶段基于NABCD评论作品
组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶 刘佳瑞 公冶令鑫 杨磊 刘欣 张宇 卢帝同 一.拉格朗日2018--<飞词> 1.1.NABCD分析 N(Need,需求):该小 ...
- js中模拟a标签的点击事件
var a = document.createElement('a'); a.target = "_blank"; a.href = "personal"; a ...
- Percona XtraDB Cluster 5.7
附加:相关在线文档https://www.percona.com/software/documentation 安装要求: 1.root权限2.保证开放3306.4444.4567.4568端口3.关 ...
- 《Spring1之第八次站立会议》
<第八次站立会议> 昨天:我查找了关于实现视频功能的相关代码. 今天:对用C#写的视频功能进行了相关的了解. 遇到的问题:由于对C#不是很了解,所以其中的有些代码还是看不懂.
- Spring笔记⑥--整合struts2
Spring如何在web应用里面用 需要额外加入的jar包 Spring-web-4.0.0 Spring-webmvc-4.0.0 Spring的配置文件,没什么不同 需要在web.xml下配置 ...
- 45度炸队Alpha冲刺博客集
博客集如下: Alpha冲刺Day1:第一天冲刺记录 Alpha冲刺Day2:第二天冲刺记录 Alpha冲刺Day3:第三天冲刺记录 Alpha冲刺Day4:第四天冲刺记录 Alpha冲刺Day5:第 ...
- SpringMVC(一)-- springmvc的系统学习之配置方式
资源:尚学堂 邹波 springmvc框架视频 一.springMVC 工作流程 页面请求---->控制器(Controller DispatcherServlet)----& ...