CF570D Tree Requests(dsu on tree)
发布日期:2021-05-10 09:53:34 浏览次数:20 分类:精选文章

本文共 1929 字,大约阅读时间需要 6 分钟。

DSU(并查集)在树结构中的应用


问题分析

在树结构中,DSU(并查集)算法通常用于解决非并发的查询问题。处理这些问题需要离线算法,因为它们通常需要预先处理所有查询后再进行操作。这意味着我们需要先收集所有的查询请求,然后逐步处理每个节点及其子树的相关信息。


核心思路

  • 预存查询:首先,我们将所有询问存储起来,这样才能进行离线处理。处理节点时,我们会涉及该节点及其子树的信息。

  • 信息统计:对于每个节点,我们会统计其自身以及子树中各个层级的字母数目。字母数目为奇数的节点只允许一个出现,因为回文串需要一个中心点。

  • 暴力查询处理:为了放置回文串的中心,我们需要确保每个层级的总字符数不超过2(偶数),这样它们才能对称地分布在两侧。

  • 结果输出:输出每个查询的是否可以形成回文串。


  • 代码实现

    /*Keep on going Never give up*/#include 
    using 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 算法处理每个节点及其子树的信息,统计各层的字母数目。
    • 检查每层字符数是否符合回文串要求,记录结果。
  • 结果输出

    • 根据处理结果输出每个查询的回文串可能性。
  • 通过以上方法,我们可以高效地解决树结构中的并查集问题,并筛选出能够形成回文串的结构。

    上一篇:CF375D Tree and Queries(dsu on tree)
    下一篇:dsu on tree 模板题目(CF600E Lomsat gelral)

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年05月09日 03时43分15秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    mysql系列:远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法 2023-01-23
    Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务、snmp服务 2023-01-23
    PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改) 2023-01-23
    PHP系列:使用PHP实现登录注册功能的完整指南 2023-01-23
    Python&aconda系列:cmd/powershell/anaconda prompt提示“系统找不到指定的路径”(亲测有效) 2023-01-23
    Python&aconda系列:(W&L)Conda使用faiss-gpu报错及解决办法、安装numpy的坑、cmd执行Python脚本找不到第三方库、安装tensorflow-gpu时遇到的from 2023-01-23
    python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向) 2023-01-23
    python&anconda系列(亲测有效):tensorflow AttributeError: ‘str’ object has no attribute ‘decode’ 2023-01-23
    python&anconda系列:tf.keras.backend.get_session()和keras.backend.get_会话()返回不同的会话对象(待解答) 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