Codeforces 741D dsu on tree
题意
传送门 Codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
题解
若某条路径的字符可以构成回文串,则至多一个字符数量为奇数,那么关注字符的奇偶性即可。设字符集的规模为 BBB,对字符集的奇偶性进行状态压缩,满足条件的两个字符集状态异或结果至多存在一个 111。若某个字符集的状态,O(B)O(B)O(B) 即可枚举满足条件的另一个状态。
dsu on tree 维护子树中各个节点字符集状态对应的最大深度,统计经过子树根节点的最长路径,最后用子孙节点的最长路径向上更新答案即可。总时间复杂度 O(BNlogN)O(BN\log N)O(BNlogN)。
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAXN = 5E5 + 5, B = 22, SZ = 1 << B, _INF = 0xc0c0c0c0;
int N, dep[MAXN], sz[MAXN], a[MAXN];
int rec[SZ], res[MAXN], cur;
struct edge
{int to, c;
};
vector<edge> G[MAXN];void _max(int &x, int y) { x = max(x, y); }void pdfs(int v, int d, int s)
{dep[v] = d, sz[v] = 1, a[v] = s;for (auto &e : G[v])pdfs(e.to, d + 1, s ^ (1 << e.c)), sz[v] += sz[e.to];
}void count(int v, int p, bool rt)
{if (!rt){for (auto &e : G[v])count(e.to, p, 0);}_max(cur, dep[v] + rec[a[v]] - 2 * dep[p]);for (int i = 0; i < B; ++i){int t = a[v] ^ (1 << i);_max(cur, dep[v] + rec[t] - 2 * dep[p]);}
}void add(int v)
{_max(rec[a[v]], dep[v]);for (auto &e : G[v])add(e.to);
}void del(int v)
{rec[a[v]] = _INF;for (auto &e : G[v])del(e.to);
}void dfs(int v, bool keep)
{int mx = -1, ch = -1;for (auto &e : G[v])if (sz[e.to] > mx)mx = sz[e.to], ch = e.to;for (auto &e : G[v])if (e.to != ch)dfs(e.to, 0);if (ch != -1)dfs(ch, 1);cur = 0;for (auto &e : G[v])if (e.to != ch)count(e.to, v, 0), add(e.to);count(v, v, 1);_max(rec[a[v]], dep[v]);res[v] = cur;if (!keep)del(v);
}void get_res(int v)
{for (auto &e : G[v]){get_res(e.to);res[v] = max(res[v], res[e.to]);}
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> N;for (int i = 1; i < N; ++i){int p;char c;cin >> p >> c;G[p - 1].pb({i, c - 'a'});}pdfs(0, 0, 0);memset(rec, 0xc0, sizeof(rec));dfs(0, 0);get_res(0);for (int i = 0; i < N; ++i)cout << res[i] << (i + 1 == N ? '\n' : ' ');return 0;
}
Codeforces 741D dsu on tree相关推荐
- Codeforces 600E. Lomsat gelral(Dsu on tree学习)
题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...
- Codeforces Round #383 (Div. 1): D. Arpa’s letter-marked tree…(dsu on tree+状压)
题意: 给你一棵n个节点的树,每条边都代表着一个字母(a~v),对于每个节点u,求出以u为根的子树中有多少条路径满足:路径上的字符重新排列后可以得到一个回文字符串 思路: 前置:dsu on tree ...
- dsu on tree(Educational Codeforces Round 2: E. Lomsat gelral)
题意: 一棵n个节点的树,每个节点都有一种颜色,如果颜色c在以u为根的子树中出现的次数大于等于一半,那么这个颜色就是u节点的支配色, 因为是大于等于,所以一个节点的支配色可能不止一种,求出每个节点的支 ...
- 【CodeForces】741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
[题意]给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串.n<=5*10^5. [算法]dsu on tree [题解]这 ...
- 2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)
题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑 ...
- 阔力梯的树(2020 CCPC Wannafly Winter Camp Day2 Div.12 )dsu on tree
题解: dsu on tree dsu on tree的基本步骤就不说了 看到这题询问结点的子树问题,而且询问时离线的,首先想到的dsu on tree的这个trick. 本题的难题就是如何维护结点所 ...
- CF375D Tree and Queries(dsu on tree)
题解: 个人感觉这个题目是一个挺不错的题的.(这里就不说dsu on tree的这个过程是什么了) 我们在dsu on tree计算答案时需要有一个小小技巧去优化一下时间复杂度. 就是当我们用一个cn ...
- CF570D Tree Requests(dsu on tree)
题解: dsu on tree 首先dsu on tree是一个离线的算法,所以我们需要先把他们的询问储存起来,然后进行操作. 针对于每一个结点,我们先统计出他和他子树的所有信息,然后对于这个结点来说 ...
- dsu on tree 模板题目(CF600E Lomsat gelral)
题解: dsu on tree 对于结点i来说,步骤为: 递归轻儿子,不保留贡献. 递归重儿子,保留贡献. 统计当前结点及所有轻儿子的贡献. 拿个样例来解释算法的流程 比如说样例2: 如图所示,有多个 ...
- 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
[UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...
最新文章
- RXSwift基本使用1
- Java核心技术卷1——笔记(1)
- JSONP跨域的原理解析
- JavaWeb 后端 三 之 Response Request 学习笔记
- win8:querySelector()方法
- 竹林蹊径:深入浅出Windows驱动开发
- html调整浏览器兼容性,浏览器兼容性问题整理
- CGAL学习之路(三):CGAL读写点云
- matlab 仿真短路故障设置,基于MatlabSimulink的电力系统故障仿真与
- 无法启动此程序因为计算机丢失d3dx9,无法启动此程序.因为计算机中丢失d3dx9_43.dll.尝试重新安装改程序以解决问题...
- 计算机暑期学校心得,暑期学校培训心得体会(通用12篇)
- arXiv镜像加载慢的解决办法
- esp8266保存html文件,八,ESP8266 文件保存数据(示例代码)
- WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
- 第一次数据分析师面试
- 如何构建用户满意的“服务化”数据平台
- 记录一下自己常用的数据库,以备不时之需
- JavaScript:实现复制粘贴剪切功能
- 怎么做网站?做网站就是这么简单
- win服务器不能上传文件,Serv u无法上传文件的两种解决方案
热门文章
- 用devc++表白_【民大表白墙】表白七号楼332进门右面下铺哥哥的第四天。你再不来,我要下雪了。云雀叫了一整天。...
- 加密流量分类任务的深度学习方法(一般框架总结)
- 汽车行业中SOP和PT是什么意思?
- C 语言绝对值函数abs实现技巧
- C/C++ abs 函数 - C语言零基础入门教程
- 读取阿里云服务器图片到本地
- 163邮箱 java发送html邮件,java邮件发送 qq与163邮箱互发和qq和163邮箱发送其余邮箱实例...
- 性能测试tps上不去,又是redis的坑,说多了都是泪啊
- 发布海外媒体稿件更好帮助企业海外营销推广
- 产品读书《自控力:斯坦福大学最受欢迎的心理学课程》