
CF570D Tree Requests(dsu on tree)
发布日期:2021-05-10 09:53:34
浏览次数:20
分类:精选文章
本文共 1929 字,大约阅读时间需要 6 分钟。
DSU(并查集)在树结构中的应用
问题分析
在树结构中,DSU(并查集)算法通常用于解决非并发的查询问题。处理这些问题需要离线算法,因为它们通常需要预先处理所有查询后再进行操作。这意味着我们需要先收集所有的查询请求,然后逐步处理每个节点及其子树的相关信息。
核心思路
预存查询:首先,我们将所有询问存储起来,这样才能进行离线处理。处理节点时,我们会涉及该节点及其子树的信息。
信息统计:对于每个节点,我们会统计其自身以及子树中各个层级的字母数目。字母数目为奇数的节点只允许一个出现,因为回文串需要一个中心点。
暴力查询处理:为了放置回文串的中心,我们需要确保每个层级的总字符数不超过2(偶数),这样它们才能对称地分布在两侧。
结果输出:输出每个查询的是否可以形成回文串。
代码实现
/*Keep on going Never give up*/#includeusing namespace std;const int maxn = 5e5 + 10;typedef long long ll;const ll mod = 1e9 +7;vector > edge(maxn);int dep[maxn], sz[maxn];vector > v[maxn];int ans[maxn], a[maxn];string s;void dfs(int x, int fa) { sz[x] = 1; dep[x] = dep[fa] + 1; for (auto i : edge[x]) { if (i == fa) continue; dfs(i, x); sz[x] += sz[i]; if (sz[i] > sz[son[x]]) { son[x] = i; } }}void cal(int x, int val) { cnt[dep[x]][a[x]] += val; for (auto i : edge[x]) { if (i == flag) continue; cal(i, val); }}void dsu(int x, int keep) { for (auto i : edge[x]) { if (i == son[x]) continue; dsu(i, keep); } if (son[x]) { dsu(son[x], true); flag = son[x]; } cal(x, 1); for (auto i : v[x]) { int temp = 0; for (int j = 1; j <= 26; j++) { if (cnt[i.first][j] & 1) { temp++; } } if (temp >= 2) { ans[i.second] = 0; } else { ans[i.second] = 1; } } if (son[x]) { flag = 0; } if (!keep) { cal(x, -1); }}int main() { // 读取输入并构造树 // ... // 处理查询 dsu(1, 0); // 输出结果 for (int i = 1; i <= m; i++) { cout << (ans[i] ? "Yes" : "No") << endl; }}
代码解释
树构建:
- 使用 DFS 进行树的构建,维护每个节点的父节点和子节点信息。
- 计算每个节点的深度和子树大小。
离线查询处理:
- 使用
dsu
算法处理每个节点及其子树的信息,统计各层的字母数目。 - 检查每层字符数是否符合回文串要求,记录结果。
结果输出:
- 根据处理结果输出每个查询的回文串可能性。
通过以上方法,我们可以高效地解决树结构中的并查集问题,并筛选出能够形成回文串的结构。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年05月09日 03时43分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
2023-01-23
PHP系列:使用PHP实现登录注册功能的完整指南
2023-01-23
Python&aconda系列:(W&L)Conda使用faiss-gpu报错及解决办法、安装numpy的坑、cmd执行Python脚本找不到第三方库、安装tensorflow-gpu时遇到的from
2023-01-23
"WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument".
2023-01-23
#if 0 #elif 1 #else #endif 用法
2023-01-23
(反射+内省机制的运用)简单模拟spring IoC容器的操作
2023-01-23
.Net(C#)实现异步编程
2023-01-23
.Net中webBrowser控件JS交互
2023-01-23
02-Docker镜像分类及操作秘籍,轻松掌握导出、导入、删除
2023-01-23
04-docker-commit构建自定义镜像
2023-01-23
04-docker系列-commit构建自定义镜像
2023-01-23
05-docker系列-使用dockerfile构建镜像
2023-01-23
09-docker系列-docker网络你了解多少(下)
2023-01-23
10-docker系列-docker文件共享和特权模式
2023-01-23