CF375D Tree and Queries(dsu on tree)
发布日期:2021-05-10 09:53:35 浏览次数:16 分类:精选文章

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

个人觉得这个题目是一个挺不错的题的。

在DSU(并查集)结合树结构进行问题解决时,如何在计算过程中快速统计超过某个次数k的节点数目是个有趣的优化问题。为了解决这一问题,我们可以通过巧妙地使用额外的数据结构来优化计算效率。

具体来说,问题出现在我们需要统计某某颜色出现次数可以达到k次以上的节点数目时,常规的方法可能会导致时间复杂度过高。我们引入了一个sum数组来高速解决这个问题。

假设我们已经统计了颜色x的出现次数为cnt[x]。那么,当我们需要知道超过k次的颜色x的节点数目时,可以直接取cnt[x]+1个节点的sum值。这个思路不仅让我们可以快速查询到超过k次的节点数目,还避免了多次遍历所有节点的复杂度。

下面是实现这一优化的详细代码解释:

#include 
#include
#include
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn], sz[maxn], son[maxn];
vector
edge[maxn];
vector
> Q[maxn]; bool visited[maxn]; ll mod = 1e9 + 7; void dfs(int x, int fa) { sz[x] = 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 fa, int val) { if (val == 1) { if (cnt[a[x]] + 1 > maxn) continue; sum[cnt[a[x]] + 1]++; if (sum[cnt[a[x]] + 1] > sum_cnt) sum[cnt[a[x]] + 1]++; } else { if (cnt[a[x]] > 0) { sum[cnt[a[x]]]--; cnt[a[x]]--; if (cnt[a[x]] == 0) cnt[a[x]] = -1; if (val == -1) sz[x] = 1; } for (auto i : edge[x]) if (i == fa || i == son[x]) continue; cal(i, x, val); } } void dsu(int x, int fa, bool keep) { int i = x; if (son[i]) { dsu(son[i], i, true); sz[i] = sz[son[i]]; if (sz[son[i]] > sz[i]) son[i] = i; } if (!keep) { if (val == 1) cal(x, fa, -1); else cal(x, fa, -1); } flag = 0; for (auto p : Q[x]) ans[p.second] = sum[p.first]; if (!keep) cal(x, fa, -1); } int main() { streamin; int n, m; readin; for (int i = 1; i <= n; i++) readin a[i]; for (int i = 0; i < n - 1; i++) { int x, y; readin; edge[x].push_back(y); edge[y].push_back(x); } for (int i = 1; i <= m; i++) { int x, y; readin; Q[x].push_back({y, i}); } dfs(1, 0); dsu(1, 0, 0); for (int i = 1; i <= m; i++) cout << ans[i] << endl;

总结:在DSU算法中,为繁便地统计超过某个出现次数的节点数目,我们引入了sum数组。sum数组的作用是根据当前颜色x的出现次数+1来记录满足条件的节点数目。具体实现通过递归地检查每个节点是否满足条件,如果满足则在sum数组中进行相应的更新。这种方法显著地提高了统计效率,避免了直接遍历所有节点的情景。

上一篇:树链剖分(轻重链剖分) 讲解 (模板题目 P3384 【模板】轻重链剖分 )
下一篇:CF570D Tree Requests(dsu on tree)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月27日 12时13分27秒

关于作者

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

推荐文章

10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了 2025-03-29
10条sql语句优化的建议 2025-03-29
10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了! 2025-03-29
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了 2025-03-29
15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了! 2025-03-29
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了! 2025-03-29
1分钟学会在Linux下模拟网络延迟 2025-03-29
200款免费的AI工具汇总 2025-03-29
2023年失业的你明白了什么道理? 2025-03-29
2023应届毕业生找不到工作很焦虑怎么办? 2025-03-29
2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了 2025-03-29
2023网络安全现状,一个(黑客)真实的收入 2025-03-29
2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
2024 最新 Kali Linux 定制化魔改,完整版,添加常见60渗透工具,零基础入门到精通,收藏这篇就够了 2025-03-29
2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
2024届秋招让我(985本硕)直接破防,感觉书读了这么久结果毫无意义,读书就只为了读书,我该怎么办? 2025-03-29
2024年专业介绍||现代通信技术,从零基础到精通,收藏这篇就够了! 2025-03-29
2024年为什么越来越多的人选择转行网络安全?零基础入门到精通,收藏这篇就够了 2025-03-29
2024年从零学习AI和深度学习Transformer的路线图(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29