[trick]dsu on tree

本文介绍了dsu on tree在解决树上子树统计问题时的应用,包括暴力方法、平衡树启发式合并、树链剖分等不同做法,以及它们的时间复杂度分析。dsu on tree通过启发式合并实现O(nlogn)的复杂度,以优化子树查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UPD 17.3.27:这个技巧实际上局限性也很明显。第一只能支持子树查询,第二不支持修改操作。

概述

写这篇文章的原因是NOIP前刷Codeforces做到一道题,用这种方式,以很低的代码复杂度做到的优秀时间复杂度。
于是我学习了一下CF上这篇文章,翻译过来安利一下,也算作是自己的学习笔记吧。

什么是dsu on tree

dsu on tree用来解决这样一类问题:统计树上一个节点的子树中具有某种特征的节点数。
例如子树中颜色为 x 的个数。
这种方法可以做到 O(nlogn) 的复杂度。
那么dsu到底是个什么玩意呢?其实它的中文译名就是众所周知的并查集…
有的小朋友就会问了,并查集怎么跑到树上去的呢?
恩……其实说白了就是启发式合并:在做一类维护问题的时候,将size较小的合并到较大的size上,从而达到降低时间复杂度的目的。
不是很懂为什么叫dsu,因为并查集的按秩合并思想?

一个例子

以上面的问题举个例子。
给出一棵树,每个节点有一种颜色。
给出若干次询问形如:树中节点 x 的子树中颜色为 c 的个数。
下面讨论了几种做法。
代码我直接粘的原文代码。

暴力

int cnt[maxn];
void add(int v, int p, int x){
    cnt[ col[v] ] += x;
    for(auto u: g[v])
        if(u != p)
            add(u, v, x)
}
void dfs(int v, int p){
    add(v, p, 1);
    //now cnt[c] is the number of vertices in subtree of vertice v that has color c. You can answer the queries easily.
    add(v, p, -1);
    for(auto u : g[v])
        if(u != p)
            dfs(u, v);
}

在这种做法中,每次统计 x 节点前,暴力将

### Wine 使用技巧与方法 Wine 是一个开源项目,旨在让 Linux 和其他类 Unix 系统能够运行 Windows 应用程序。它通过模仿 Windows API 来实现这一目标,而无需实际安装 Windows 操作系统。以下是一些关于使用 Wine 的技巧和方法[^1]。 #### 安装应用程序 要安装 Windows 应用程序,用户可以简单地双击 `.exe` 文件,或者在终端中运行 `wine <application_name>.exe`。如果需要更高级的安装选项,可以使用 Winetricks 工具来安装依赖项和库[^2]。 ```bash winetricks vcrun2019 ``` 上述命令将安装 Visual C++ 2019 Redistributable,这是许多现代 Windows 应用程序所必需的。 #### 调整图形设置 某些应用程序可能需要特定的 DirectX 或 OpenGL 设置才能正常运行。可以通过 `winecfg` 工具调整这些设置: ```bash winecfg ``` 在 `Graphics` 标签页中,可以启用或禁用虚拟桌面,并调整分辨率和其他图形相关选项[^3]。 #### 使用前缀隔离环境 Wine 允许创建多个前缀(prefix),每个前缀相当于一个独立的 Windows 环境。这有助于隔离不同应用程序之间的冲突。创建新前缀的方法如下: ```bash WINEPREFIX=~/.new_prefix wineboot --init ``` 然后,在该前缀下运行应用程序时,需指定相同的 `WINEPREFIX` 环境变量。 #### 日志调试 如果某个应用程序无法正常运行,可以启用调试日志以获取更多信息。通过设置 `WINEDEBUG` 环境变量,可以控制输出的日志级别: ```bash WINEDEBUG=+all wine <application_name>.exe ``` 注意,生成的日志文件可能会非常大,因此建议仅在需要时启用此功能[^4]。 #### 性能优化 为了提高性能,可以禁用不必要的功能,例如字体平滑和视觉主题。同样,可以在 `winecfg` 中调整 CPU 数量和内存分配。 ```python import os # 设置 WINEDEBUG 环境变量 os.environ['WINEDEBUG'] = '+all' ``` #### 注意事项 确保系统已安装所有必要的依赖项,包括 32 位和 64 位库。此外,某些应用程序可能需要特定版本的 Wine 才能正常工作。在这种情况下,可以尝试使用 Wine Staging 版本,它通常包含更多实验性功能和支持[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值