洛谷月赛 P5588 小猪佩奇爬树

news2024/11/6 11:34:37

题目描述

佩奇和乔治在爬树。

给定 n 个节点的树 T(V,E),第 i 个节点的颜色为 wi​,保证有1≤wi​≤n。

对于1≤i≤n,分别输出有多少对点对(u,v),满足u<v,且恰好经过所有颜色为 i 的节点,对于节点颜色不为 i 的其他节点,经过或不经过均可。

输入格式

第一行1 个正整数,表示 n 。

第二行 n 个正整数,第 i 个正整数表示 wi​。

之后 n−1 行,每行 2 个正整数 u,v,表示 T 中存在边(u,v)。

#include<bits/stdc++.h>
#define del(a,i) memset(a,i,sizeof(a))
#define ll long long
#define inl inline
#define il inl void
#define it inl int
#define ill inl ll
#define re register
#define ri re int
#define rl re ll
#define mid ((l+r)>>1)
#define lowbit(x) (x&(-x))
#define INF 0x3f3f3f3f
using namespace std;
template<class T>il read(T &x){
	int f=1;char k=getchar();x=0;
	for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
	for(;k>='0'&&k<='9';k=getchar()) x=(x<<3)+(x<<1)+k-'0';
	x*=f;
}
template<class T>il _print(T x){
	if(x/10) _print(x/10);
	putchar(x%10+'0');
}
template<class T>il print(T x){
	if(x<0) putchar('-'),x=-x;
	_print(x);
}
ll mul(ll a,ll b,ll mod){long double c=1.;return (a*b-(ll)(c*a*b/mod)*mod)%mod;}
it qpow(int x,int m,int mod){
	int res=1,bas=x%mod;
	while(m){
		if(m&1) res=(1ll*res*bas)%mod;
		bas=(1ll*bas*bas)%mod,m>>=1;
	}
	return res%mod;
}
const int MAXN = 1e6+5;
int n,col[MAXN],u,v,head[MAXN],num_edge,num[MAXN],cnt[MAXN],tail[MAXN],sz[MAXN];
ll ans[MAXN],mx;
struct Edge{
	int next,to;
	Edge(){}
	Edge(int next,int to):next(next),to(to){}
}edge[MAXN<<1];
il add_edge(int u,int v){
	edge[++num_edge]=Edge(head[u],v),head[u]=num_edge;
	edge[++num_edge]=Edge(head[v],u),head[v]=num_edge;
}
il DFS(int u,int fa){
	int ct=cnt[col[u]],tot=0,fla=0;sz[u]=1;//ct 表示之前有多少该颜色出现,fla 记录是否第一次出现为情况4的上端点,tot 记录有几个子树中出现了这种颜色
	for(ri i=head[u],tmp=ct;i;i=edge[i].next){
		if(edge[i].to==fa) continue;
		DFS(edge[i].to,u),sz[u]+=sz[edge[i].to];
		if(cnt[col[u]]>tmp) ++tot,tmp=cnt[col[u]];
		if(num[col[u]]-1==cnt[col[u]]&&!ct&&tot==1&&!fla){
            // 说明除了这个点外,该颜色其他的点已经第一次全部出现,且是情况4
			fla=1;
			if(ans[col[u]]!=-1) ans[col[u]]=0;//如果之前已经计算过,说明有2个及以上的下端点,不合法
			else ans[col[u]]=1ll*sz[tail[col[u]]]*(n-sz[edge[i].to]);// 计算情况4
		}
	}
	if(num[col[u]]==1){// 说明为情况2,即只有一个点
		ans[col[u]]=0;
		for(ri i=head[u],tot=0;i;i=edge[i].next){
			if(edge[i].to==fa) continue;
			ans[col[u]]+=1ll*tot*sz[edge[i].to];
			tot+=sz[edge[i].to];
		}
		ans[col[u]]+=1ll*(sz[u]-1)*(n-sz[u])+n-1;
	}
	else if(!tot){//说明子树中没有该颜色的点,为一个下端点
		if(!tail[col[u]]) tail[col[u]]=u;//记录
		else{
			if(ans[col[u]]!=-1) ans[col[u]]=0;//出现非法情况
			else ans[col[u]]=1ll*sz[u]*sz[tail[col[u]]];//计算
		}
	}
	++cnt[col[u]];
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	read(n),mx=1ll*n*(n-1)/2,del(ans,-1);
	for(ri i=1;i<=n;++i) read(col[i]),++num[col[i]];
	for(ri i=1;i<n;++i) read(u),read(v),add_edge(u,v);
	DFS(1,0);
	for(ri i=1;i<=n;++i){
		if(!num[i]) print(mx),puts("");
		if(num[i]) print(ans[i]),puts("");
	}
	return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年【金属非金属矿山(地下矿山)安全管理人员】考试内容及金属非金属矿山(地下矿山)安全管理人员考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试内容根据新金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将金属非金属矿山&#xf…

leetcode分类刷题:如何更好地理解递归

文章目录 概念含义递归三要素递归算法的编程模型递归问题分类递归vs循环(迭代)参考文献 参考知乎上递归下的一个高赞回答&#xff0c;觉得写的非常好&#xff0c;挑选有助于自己理解的内容进行简单总结。 概念含义 1、递归(Recursion)是指在函数的定义中调用函数自身的方法&…

一篇文章教会你C++11入门知识点

C11入门 列表初始化1. {}初始化2. initializer_list 声明1. auto2. decltype3. nullptr 范围for循环STL新增容器1. array2. forward_list3. unordered_map和unordered_set 右值引用和移动语义1. 左值引用和右值引用2. 左值引用和右值引用比较3. 右值引用使用场景和意义4. 右值引…

16-spring AOP核心对象的创建

文章目录 1. aop的几个重要概念2. aop bean definition3. AspectJPointcutAdvisor4.AopConfigUtils5.AnnotationAwareAspectJAutoProxyCreator6. 循环依赖1. aop的几个重要概念 参考官方解释:https://docs.spring.io/spring-framework/docs/5.2.9.RELEASE/spring-framework-r…

操作系统备考学习 day10

操作系统备考学习 day10 第三章 内存管理3.2 虚拟内存管理3.2.1 虚拟内存的基本概念传统存储管理方式的特征、缺点局部性原理虚拟内存的定义和特征如何实现虚拟内存技术 3.2.2 请求分页管理方式页表机制缺页中断机构地址变换机构 3.2.3 页面置换算法最佳置换算法&#xff08;OP…

总结一下vue中v-bind的常见用法

文章目录 &#x1f415;前言&#xff1a;&#x1f3e8;简述一下v-bind命令其它写法 &#x1f415;前言&#xff1a; 本篇博客主要总结一下v-bind命令在vue中的常见用法 &#x1f3e8;简述一下v-bind命令 v-bind命令是将动态的数据属性与咱们的标签进行一个绑定,它可以绑定标…

二维码智慧门牌管理系统:革新小区安全管理的新力量

文章目录 前言一、外采人员的数据采集二、二维码智慧门牌管理系统的创新性三、居民的便捷体验四、面临的挑战 前言 在科技快速发展的今天&#xff0c;智能化和数字化已经深刻影响着我们的生活的各个方面。近期备受关注的话题之一是二维码智慧门牌管理系统&#xff0c;这一系统…

缓存失效方案

一、背景 WRITE &#xff1a; 数据写入Mysql 和 Redis缓存&#xff0c; READ&#xff1a;先从 Redis 缓存中取数据&#xff0c;拿不到再从Mysql中加载&#xff0c;更新到Redis 上图第三阶段&#xff0c;接收Mysql的binlog变更消息&#xff0c;可以参考阿里的 Canal&#xff0…

tooltip里面画echarts图

第一步: 第二步; 完整代码: //协作工作受理分析圆柱形workLineChart(xData, yData) {let that this;let option {backgroundColor: "#061326",grid: {top: "10%",bottom: "5%",left: "5%",right: "5%",containLabel: true…

【C语言必知必会 | 子系列第一篇】深入剖析顺序结构(1)

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会子系列】第一篇&#xff0c;基于进行C语言顺序结构的选择题专项练习&#xff0c;结合专题优质题目&#xff0c;带领读者从0开…

软件测试01

一、认识软件及测试 1、什么是软件 控制计算机硬件工作的工具 2、软件的基本组成 页面客户端------请求----->代码服务器-------请求------>数据服务器 3、软件产生过程 需求产生------->需求文档------->设计效果图------->产品开发-------->产品测试 …

消失的它:网络层分片包中的第一个分片包去哪了?

在网络层IP包分片的过程中&#xff0c;遇到了大麻烦&#xff01; 主机A&#xff1a; IP地址&#xff1a;192.168.0.10/24 MAC地址&#xff1a;02:00:00:00:00:10 主机B&#xff1a; IP地址&#xff1a;192.168.0.20/24 MAC地址&#xff1a;02:00:00:00:00:20 MTU&#xff1a;1…

算法通过村第十五关-超大规模|黄金笔记|超大规模场景

文章目录 前言对20GB文件进行排序超大文本中搜索两个单词的最短距离从10亿数字中寻找小于100万个数字总结 前言 提示&#xff1a;你生命的前半辈子或许属于别人&#xff0c;活在别人的认为里。那把后半辈子还给自己&#xff0c;去追随你内在的声音。 --荣格 理解了前面的几个题…

13.Tensor Product:Vector - Covector Pairs

之前对于Tensor 的最好的定义&#xff1a; 需要注意的是&#xff1a;本文的一些内容使用的是非国际标准的符号&#xff0c;只是视频制作人的个人偏好。 如上图&#xff1a;张量是 使用张量积组合在一起的向量和协向量的集合。 所以&#xff0c;向量和协向量就像是所有其他张量…

外包干了2个月,技术退步太明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

网工内推 | 金融业,网络管理岗,CCIE优先,最高30k

01 国民养老保险 招聘岗位&#xff1a;网络管理岗 职责描述&#xff1a; 1.负责公司整体网络架构规划、设计&#xff0c;制定整体网络方案&#xff0c;完善网络拓扑架构标准化文档&#xff0c;对公司现有网络进行梳理及持续优化。 2.负责公司网络系统建设&#xff0c;建立具备…

15-bean生命周期,循环依赖

文章目录 1. bean生命周期 1. bean生命周期

前端学成在线项目详细解析一

学成在线项目 01-项目目录 网站根目录是指存放网站的第一层文件夹&#xff0c;内部包含当前网站的所有素材&#xff0c;包含 HTML、CSS、图片、JavaScript等等。 首页引入CSS文件 <!-- 顺序要求&#xff1a;先清除再设置 --> <link rel"stylesheet" hre…

Hexo搭建个人博客系列之环境准备

环境准备 Git Git官网&#xff0c;安装过程,就是一直下一步,详细的看这篇文章 Git的安装 Node.js Node.js官网 Node.js的安装 注册一个GitHub账号 安装hexo 新建一个文件夹(位置任意),运行cmd(若出现了operation not permitted,就以管理员的权限来运行cmd)&#xff0c;运行…

UE4逆向篇-2_各类数据的查找方式

写在前面 1.通过前面的文章&#xff0c;相信各位已经能够自己找到GNames并使用DUMP工具导出GNames了。 2.本篇文章将介绍各种所需数据的查找方法。 一、准备工作 1.CheatEngine&#xff0c;本篇以及后续篇幅的重要工具。 2.一个记事本&#xff0c;保证你能记录下关键信息。…