P5593 题解

news/2024/10/5 23:05:07/文章来源:https://www.cnblogs.com/FRZ29/p/18448657

题目

分析

首先考虑什么样的颜色能被链覆盖。

容易想到当某种颜色恰巧在一条链上会被覆盖。

所以只需要判断一种颜色是否能构成链即可,链的贡献也很好计算。

算法

考虑链的性质:有且仅有两个端点。

凭借这个性质,可以判断一种颜色是否在一条链上。

在 dfs 中考虑各种情况。

假设一个点 \(u\),其颜色为 \(c\),有以下 \(2\) 种情况判断 \(u\) 是否为端点。

  1. 如果 \(u\) 的子树中没有颜色 \(c\) 的节点,那么 \(u\) 点是一个端点。
  2. 满足两个条件。
    1. 除了 \(u\) 的子树没有颜色 \(c\) 的节点。
    2. \(u\) 的所有儿子中,只有一个儿子的子树中有颜色 \(c\)

判断端点数量是否等于 \(2\),等于 \(2\) 说明该种颜色恰好构成一条链。

还有一个特殊情况:某个颜色可能只有一个点,需要直接算答案。

如果是一条链的话,假设两条节点为 \(p, q\),对答案的贡献有两种情况。

  1. 如果 \(p, q\) 均是满足上述第 \(1\) 种情况的,答案为 \(sz_p \times sz_q\)
  2. 如果 \(p\) 是满足上述第 \(2\) 种情况的,考虑一下,因为 \(p\) 的所有儿子中,只有一个儿子的子树中有颜色 \(c\),假设该儿子为 \(pos\),所以 \(p\) 的其他儿子的子树中的节点也能对答案有贡献,故答案为 \((n - sz_{pos}) \times sz_q\)

如何实现见代码。

#ifdef ONLINE_JUDGE
#else
#define FRZ_29
#endif#include <iostream>
#include <cstdio>
typedef long long LL;using namespace std;void RD() {}
template<typename T, typename... U> void RD(T&x, U&... arg) {x = 0; int f = 1; char ch = getchar();while (ch > '9' || ch < '0') { if (ch == '-') ch = getchar(); ch = getchar(); }while (ch <= '9' && ch >= '0') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();x *= f; RD(arg...);
}void WT() {}
template<typename T> void WT(T x) {if (x < 0) { putchar('-'); x = -x; }if (x > 9) WT(x / 10);putchar(x % 10 + '0');
}const int N = 3e6 + 5;#define LF(i, __l, __r) for (int i = __l; i <= __r; i++)
#define RF(i, __r, __l) for (int i = __r; i >= __l; i--)int head[N], ver[N << 1], Next[N << 1], _tot = 1;
int n, a[N], tot[N], nos[N], enos[N], cnt[N], sz[N];
LL ans, ans1[N], ans2[N];void add(int u, int v) {ver[++_tot] = v;Next[_tot] = head[u], head[u] = _tot;
}/*
如果 flag == 1,才能判断为端点
这是由 flag 的增加方式决定的
*/
void dfs(int u, int _f) {int c = a[u], flag = 0, pos = 0;int k = cnt[c];sz[u] = 1;for (int i = head[u]; i; i = Next[i]) {int v = ver[i];if (v == _f) continue;int la = cnt[c];dfs(v, u);ans1[u] += 1LL * sz[u] *sz[v];sz[u] = sz[u] + sz[v];if (la != cnt[c]) flag++, pos = v; // 与判断是否为端点的条件2相关}                                      // 如果该条件被满足两次pos自然就无用了ans1[u] += 1LL * sz[u] * (n - sz[u]);if (k || cnt[c] != tot[c] - 1) flag++; // 与判断是否为端点的条件1相关cnt[c]++;if (flag == 1) {if (!enos[c]) nos[c] = u;else {int p = pos ? n - sz[pos] : sz[u];ans2[c] = 1LL * p * sz[nos[c]];}enos[c]++;}
}int main() {
#ifdef FRZ_29freopen("read.in", "r", stdin);freopen("out.out", "w", stdout);
#endifRD(n);LF(i, 1, n) {RD(a[i]); tot[a[i]]++; nos[a[i]] = i;}LF(i, 1, n - 1) {int u, v; RD(u, v);add(u, v), add(v, u);}dfs(1, 0);LF(i, 1, n) {if (tot[i] == 0) ans ^= 1LL * n * (n - 1) / 2;else if (tot[i] == 1) ans ^= ans1[nos[i]];else if (enos[i] == 2) ans ^= ans2[i];else ans ^= 0;}WT(ans);return 0;
}

七月流火,九月授衣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808774.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三千字长文:我知道的输入法技巧都在这了

这些技巧能让你打字更快、更好。这些技巧能让你打字更快、更好。 ‍ 官方设置 目前市面上有很多输入法软件,其中很多功能都是共有的,因为都是基础功能。因此,当选择了一款输入法好,可以先打开设置页面,好好地了解有什么功能。 此外,还可以看输入法官网文档,例如搜狗输入…

通过图片中信息得出地点

图片中会隐藏信息,比如右下角的小票将它翻转,可以看到 erbang Alaf Restaurant,Bangunan,Jalan SS21/39,Selang,这些字眼,于是直接用浏览器搜索 Gerbang正好填补了没看到的缺角, 地址上的Bangunan,Jalan SS21/39符合小票上的字,说明这就是图中的餐厅 作者想说,当要发布照…

实验1:UML与面向对象程序设计原则

[实验任务一]:UML复习 阅读教材第一章复习UML,回答下述问题: 面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。 1、关联关系2、聚合关系3、依赖关系4、组合关系[实验任务二]:单一职责原则 登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单…

图片地点

图片中会隐藏信息,比如右下角的小票将它翻转,可以看到 erbang Alaf Restaurant,Bangunan,Jalan SS21/39,Selang,这些字眼,于是直接用浏览器搜索 Gerbang正好填补了没看到的缺角, 地址上的Bangunan,Jalan SS21/39符合小票上的字,说明这就是图中的餐厅 作者想说,当要发布照…

等保2.0理解

等级保护(分等级保护,分等级监管):对信息系统分等级实行安全保护 对安全产品分等级管理 对安全事件分等级响应,处置动作:定级,备案,建设整改,等级测评,监督检查 风险评估,安全监测,通报预警,案事件调查,数据防护,自主可控,供应链安全,效果评价,综合考核,等等…

P10418 [蓝桥杯 2023 国 A] 相连的边 题解

一个比较有趣的树形 DP,情况比较多。 【题目简述】 给定一棵树,求三条相连的边,其边权之和最大。 【思路】 以 X 代表当前节点,S 表示儿子,G 表示孙子,P 表示父节点。首先把树建出来,在以下图中,我们模拟二号点的 DP 过程,考虑以下几种情况:有一条边指向父节点时FG(…

订单交易平台三(登录界面整个实现过程)阶段一(只实现简单的登录功能)

1.在视图函数account进行写代码逻辑(需要了解django中form组件的知识、md5码加密、脚本的编写) 1.1 登录界面后端的编写 """ 在account.py文件 """from django.shortcuts import render, redirect from web import modelsfrom utils.encrypt …

订单交易平台二(写代码之前的准备工作)

订单交易平台准备工作 1.先搭建环境 # 1.先创建python基本环境,并且创建虚拟环境# 2.创建完成后,先安装你所需要的Django版本: pip install Django==3.2# 3.创建Django项目: django-admin startproject app01 .# 4.创建Django,在app01根目录文件下创建apps文件,里面放app文…

PM的正交调解法

1.PM的模拟调制过程 ​ PM信号是一种相位调制信号,其携带的信息保存在其信号的相位中,通过改变载波的相位来实现基带数据的传输。 其函数表达式如下: \[s(t) = A*cos(w_c*t + K_f*m(t)) \]其中: \(A\):表示载波幅度。 \(m(t)\):表示基带信号。 \(w_c\):表示载波信号角度增量…

监控室值班人员脱岗睡岗识别系统

监控室值班人员脱岗睡岗识别系统基于Yolov7深度学习神经网络算法,监控室值班人员脱岗睡岗识别系统可以7*24小时不间断自动监控总监控室值班人员是否在工位上(脱岗睡岗玩手机),若值班人员没有在总监控室系统则立即抓拍告警,算法鲁棒性强。监控室值班人员脱岗睡岗识别系统检…

监控室值班人员脱岗识别系统

监控室值班人员脱岗识别系统通过AI视觉技术,监控室值班人员脱岗识别系统实现企业总监控室值班人员脱岗、睡岗、玩手机等场景的AI识别,不需人为干预全天候自动识别。监控室值班人员脱岗识别系统通过建设视频监控智能识别功能赋能企业端,监控室值班人员脱岗识别系统对各个生产…