在地铁上口胡了一下。不知道对不对。

考虑记录每一个点 \(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 的解法的更多相关文章

  1. dsu on tree ——附带buff的暴力解法

    这篇博客只是简单叙述思想(因为ML太弱了),具体例题请转其他博客. dsu on tree,许多OI将其归于启发式合并,当然如果你能理解更好,这只是一个理解方式罢了. 思想简述 顾名思义,这个算法是处 ...

  2. DSU On Tree——Codeforces 600E(E. Lomsat gelral)

    有这么一类问题,要求统计一棵树上与子树相关的某些信息,比如:在一棵所有节点被染色的树上,统计每棵子树上出现次数最多的颜色编号之和. 很自然的可以想到用DFS序+主席树去求解,但是编码复杂度很高: 然后 ...

  3. 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,求每个子树中最长的边,满 ...

  4. CF 570D. Tree Requests [dsu on tree]

    传送门 题意: 一棵树,询问某棵子树指定深度的点能否构成回文 当然不用dsu on tree也可以做 dsu on tree的话,维护当前每一个深度每种字母出现次数和字母数,我直接用了二进制.... ...

  5. [dsu on tree]【学习笔记】

    十几天前看到zyf2000发过关于这个的题目的Blog, 今天终于去学习了一下 Codeforces原文链接 dsu on tree 简介 我也不清楚dsu是什么的英文缩写... 就像是树上的启发式合 ...

  6. CF 375D. Tree and Queries【莫队 | dsu on tree】

    题意: 一棵树,询问一个子树内出现次数$≥k$的颜色有几种 强制在线见上一道 用莫队不知道比分块高到哪里去了,超好写不用调7倍速度!!! 可以用分块维护出现次数这个权值,实现$O(1)-O(\sqrt ...

  7. dsu on tree 树上启发式合并 学习笔记

    近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...

  8. UOJ#266. 【清华集训2016】Alice和Bob又在玩游戏 博弈,DSU on Tree,Trie

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ266.html 题解 首先我们可以直接暴力 $O(n^2)$ 用 sg 函数来算答案. 对于一个树就是枚举 ...

  9. dsu on tree入门

    先瞎扯几句 说起来我跟这个算法好像还有很深的渊源呢qwq.当时在学业水平考试的考场上,题目都做完了不会做,于是开始xjb出题.突然我想到这么一个题 看起来好像很可做的样子,然而直到考试完我都只想出来一 ...

  10. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree

    原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...

随机推荐

  1. ubuntu下搭建Gitea代码托管平台

    在 Ubuntu 上部署 Gitea 是设置本地代码托管平台的简洁和高效选择.以下是详细步骤: 步骤 1:更新系统 sudo apt update && sudo apt upgrad ...

  2. JS如何实现远程控制:一步步教你掌握技术

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  3. 第六章: SEO与交互指标 二

    上一篇文章地址 5. 提升用户参与度 提高用户参与度不仅有利于SEO,还能增加转化率和用户留存. 5.1 内容结构优化 使用吸引人的标题和小标题: 使用数字列表.问题形式或"如何" ...

  4. 从实际的编程示例中看i++与++i的区别

    举一个简单的例子,我们希望给一个长字符串出现的每个字符的数量进行打表 这里给出部分代码 String p; HashMap<Character,Integer> map =new Hash ...

  5. L2-2、示范教学与角色扮演:激发模型"模仿力"与"人格"

    一.Few-shot 教学的核心原理与优势 在与大语言模型交互时,Few-shot(少样本)教学是一种强大的提示技术.其核心原理是通过提供少量示例,引导模型理解我们期望的输出格式和内容风格. Few- ...

  6. Spring Boot 整合Redisson操作Redis基础篇

    <Spring Boot 整合Redisson配置篇> <Spring Boot 整合Redisson操作Redis基础篇> <Redisson批量操作类RBuckets ...

  7. Ubuntu 安装最新版本 node.js

    第一步,去官网看看当前最新的版本是多少,比如当前最新是v18.12.0 curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - ...

  8. 代码随想录第四天 | 链表part02

    两两交换链表中的节点 用虚拟头结点,这样会方便很多. 本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点. 题目链接/文章讲解/视频讲解: https: ...

  9. windows下大数据开发环境搭建(5)——Hive环境搭建

    本文介绍如何在windows下搭建Hive开发环境,主要依赖的环境是Java和Hadoop,其他大部分工作主要是动手配置的工作,按照下面的介绍一步步操作即可完成搭建. 一.所需环境 1.Java:wi ...

  10. k8s events说明

    简单说明 k8s的Event事件是一种资源对象,用于展示集群内发生的情况,k8s系统中的各个组件会将运行时发生的各种事件上报给apiserver . 可以通过kubectl get event 或 k ...