CF1923E 一个无需 DSU On Tree 的解法
在地铁上口胡了一下。不知道对不对。
考虑记录每一个点 \(i\) 离他最远的一个祖先使得祖先到 \(i\) 的路径上没有 \(a_i\)。设他为 \(\text{lst}_i\)。然后如果两个 \(u, v\) 的 \(\text{lst}\) 相等,那么这条路径就是好的。每种颜色枚举即可。
八成假了(?),欢迎 Hack。
PS:全对了,确实能过。
/*******************************
| Author: DE_aemmprty
| Problem: E. Count Paths
| Contest: Codeforces - Educational Codeforces Round 162 (Rated for Div. 2)
| URL: https://codeforces.com/contest/1923/problem/E
| When: 2024-02-23 23:29:35
|
| Memory: 512 MB
| Time: 2000 ms
*******************************/
#include <bits/stdc++.h>
using namespace std;
long long read() {
char c = getchar();
long long x = 0, p = 1;
while ((c < '0' || c > '9') && c != '-') c = getchar();
if (c == '-') p = -1, c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * p;
}
const int N = 2e5 + 7;
int n;
int c[N], lst[N], f[N];
vector <int> to[N], pos[N];
vector <int> p[N];
vector <int> col;
int cnt[N];
void dfs(int u, int fa) {
f[u] = fa;
if (fa) p[c[fa]].push_back(u);
lst[u] = 0;
if (p[c[u]].size()) lst[u] = p[c[u]].back();
for (int v : to[u])
if (v != fa)
dfs(v, u);
if (fa) p[c[fa]].pop_back();
}
void solve() {
n = read();
for (int i = 1; i <= n; i ++) {
c[i] = read();
pos[i].clear();
to[i].clear();
p[i].clear();
}
for (int i = 1; i <= n; i ++)
pos[c[i]].push_back(i);
for (int i = 1, u, v; i < n; i ++) {
u = read(), v = read();
to[u].push_back(v);
to[v].push_back(u);
}
dfs(1, 0); long long ans = 0;
for (int i = 1; i <= n; i ++) {
for (int x : pos[i]) {
cnt[lst[x]] ++;
col.push_back(lst[x]);
}
for (int x : col) {
ans += 1ll * cnt[x] * (cnt[x] - 1) / 2;
cnt[x] = 0;
}
col.clear();
}
for (int i = 1; i <= n; i ++)
ans += (f[lst[i]] > 0);
cout << ans << '\n';
}
signed main() {
int t = 1;
t = read();
while (t --) solve();
return 0;
}
CF1923E 一个无需 DSU On Tree 的解法的更多相关文章
- dsu on tree ——附带buff的暴力解法
这篇博客只是简单叙述思想(因为ML太弱了),具体例题请转其他博客. dsu on tree,许多OI将其归于启发式合并,当然如果你能理解更好,这只是一个理解方式罢了. 思想简述 顾名思义,这个算法是处 ...
- DSU On Tree——Codeforces 600E(E. Lomsat gelral)
有这么一类问题,要求统计一棵树上与子树相关的某些信息,比如:在一棵所有节点被染色的树上,统计每棵子树上出现次数最多的颜色编号之和. 很自然的可以想到用DFS序+主席树去求解,但是编码复杂度很高: 然后 ...
- CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]
D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths CF741D 题意: 一棵有根树,边上有字母a~v,求每个子树中最长的边,满 ...
- CF 570D. Tree Requests [dsu on tree]
传送门 题意: 一棵树,询问某棵子树指定深度的点能否构成回文 当然不用dsu on tree也可以做 dsu on tree的话,维护当前每一个深度每种字母出现次数和字母数,我直接用了二进制.... ...
- [dsu on tree]【学习笔记】
十几天前看到zyf2000发过关于这个的题目的Blog, 今天终于去学习了一下 Codeforces原文链接 dsu on tree 简介 我也不清楚dsu是什么的英文缩写... 就像是树上的启发式合 ...
- CF 375D. Tree and Queries【莫队 | dsu on tree】
题意: 一棵树,询问一个子树内出现次数$≥k$的颜色有几种 强制在线见上一道 用莫队不知道比分块高到哪里去了,超好写不用调7倍速度!!! 可以用分块维护出现次数这个权值,实现$O(1)-O(\sqrt ...
- dsu on tree 树上启发式合并 学习笔记
近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...
- UOJ#266. 【清华集训2016】Alice和Bob又在玩游戏 博弈,DSU on Tree,Trie
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ266.html 题解 首先我们可以直接暴力 $O(n^2)$ 用 sg 函数来算答案. 对于一个树就是枚举 ...
- dsu on tree入门
先瞎扯几句 说起来我跟这个算法好像还有很深的渊源呢qwq.当时在学业水平考试的考场上,题目都做完了不会做,于是开始xjb出题.突然我想到这么一个题 看起来好像很可做的样子,然而直到考试完我都只想出来一 ...
- 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree
原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...
随机推荐
- 云服务器的CPU利用率,外网出带宽使用率,内存利用率,磁盘利用率
云服务器的CPU利用率.外网出带宽使用率.内存利用率和磁盘利用率是用于监测服务器性能和资源使用情况的关键指标,它们各自代表不同方面的服务器运行状态: CPU利用率:CPU(中央处理单元)利用率表示服务 ...
- 结合pandas,sqlite3批量将csv数据导入sqlite数据库
import sqlite3 import pandas as pd conn=sqlite3.connect(r'demo.db') c=conn.cursor() 创建新表 c.execute(& ...
- codeup之A+B 输入输出练习I 、II 、III、IV、V、VI、VII、VIII(黑盒测试
不建议做,掌握书上几种情况即可,题简单又重复 I Description 你的任务是计算a+b.这是为了acm初学者专门设计的题目.你肯定发现还有其他题目跟这道题的标题类似,这些问题也都是专门为初学者 ...
- Solon AI 正试发布(支持 java8+,RAG,MCP)
Solon AI 正试发布了(版号,随 Solon v3.3.1).历时小半年. 1.简介 Solon AI 是一个 Java AI(智能体) 全场景应用开发框架,提供有丰富的接口能力.主要支持的的智 ...
- linux下用android-file-transfer-linux替换掉 gvfs-mtp来挂载mtp
用android-file-transfer-linux替换掉 gvfs-mtp来挂载mtp 问题现状 在我使用gvfs-mtp挂载的时候,无论读取文件还是获取对应文件夹下所有文件的路径等操作,都非常 ...
- 面试题-Thread.sleep(0)的作用是什么
就是线程等待的意思.由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep( ...
- 20244104陈思淼 实验四 Python综合实践
课程:<Python程序设计> 班级: 2441 姓名: 陈思淼 学号:202444104 实验教师:王志强 实验日期:2025年5月29日 必修/选修: 公选课 1.实验内容 Pytho ...
- Huawei Matebook e 2022 安装 archlinux 双系统
本文同步发布于我的网站 安装之前 wifi 名称修改为英文+数字的,以防之后没法联网 准备好 U 盘并使用 GPT 分区表写入最新的 arch 镜像. 基础安装 开机按 F2 进入 UEFI/BIOS ...
- NOIp2020复赛前日志
NOIp2020复赛前日志 组合数和卢卡斯定理 首先写的顺序别搞错了 从\(n\)个不同元素中取出\(m(m≤n)\)个元素的所有组合的个数 \[C_n^m=\binom nm=C(n,m)=\fra ...
- Keil watch中数据不更新解决办法
watch数据不更新解决办法 在使用keil的watch窗口观察寄存器里面的值进行调试时,有时候里面的值就是不会更新,经测试打开View中最下面的那个按键即可