【JOISC2018|2019】【20190622】mergers
题目
一\(n\)个节点的树,节点被分成\(k\)个集合,\(i\)属于\(S_i\),
一条边是可划分的当且仅当左右两边的子树不存在相同集合的点
你一次可以合并两个集合,求最少的操作次数使得所有边都不可划分
$N \le 5\times 10^5 \ , \ S_i \le K \le N $
题解
如果\(S_x=S_y\),那么$ x \(到\) y $路径上的边都不可划分,把他们缩起来
即把所有相同颜色的点两两路径的连通块缩起来
得到一个所有节点颜色不同的树
相当于连最少的边使得对应路径覆盖所有树边
答案是(叶子数+1)/2
#include<bits/stdc++.h> using namespace std; const int N=500010; int n,m,f[N],c[N],fa[N],dep[N],o=1,hd[N],d[N];
struct Edge{int v,nt;}E[N<<1]; char gc(){
static char*p1,*p2,s[1000000];
if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=0;char C=gc();
while(C<'0'||C>'9')C=gc();
while(C>='0'&&C<='9')x=(x<<1)+(x<<3)+C-'0',C=gc();
return x;
} void adde(int u,int v){
E[o]=(Edge){v,hd[u]};hd[u]=o++;
E[o]=(Edge){u,hd[v]};hd[v]=o++;
} int find(int x){return f[x]==x?x:f[x]=find(f[x]);} void dfs(int u){
f[u]=u;
for(int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(v==fa[u])continue;
fa[v]=u;dep[v]=dep[u]+1;
dfs(v);
}
} void merge(int u,int v){
u=find(u),v=find(v);
while(u!=v){
if(dep[u]<dep[v])swap(u,v);
f[u]=find(fa[u]),u=f[u];
}
} int main(){
freopen("mergers.in","r",stdin);
freopen("mergers.out","w",stdout);
n=rd();m=rd();
for(int i=1;i<n;++i)adde(rd(),rd());
dfs(1);
for(int i=1,x;i<=n;++i){
x=rd();
if(!c[x])c[x]=i;
else merge(c[x],i);
}
for(int i=1;i<o;i+=2){
int fu=find(E[i].v),fv=find(E[i+1].v);
if(fu!=fv)d[fu]++,d[fv]++;
}
int lf=0;
for(int i=1;i<=n;++i)if(d[i]==1)lf++;
cout<<((lf+1)>>1)<<endl;
return 0;
}
【JOISC2018|2019】【20190622】mergers的更多相关文章
- 【JOISC2018|2019】【20190622】minerals
题目 交互题 有\(2n\)个物品,编号为\(1-2n\),存在唯一的两两配对关系,即有\(n\)种物品 有一个盒子,初始为空,盒子上会显示里面存在的物品种类数\(C\) 你每次操作可以将一个物品从盒 ...
- 【FJWC 2019】 森林
[FJWC 2019] 森林 样例输入 0 5 1 0 0 2 样例输出 1 2 3 3 我们发现,答案就是直径加上直径上某个点出发,不经过其他直径上的点的最长链.这里的直径可以是任意一条直径. 首先 ...
- 【FJWC 2019】min
[FJWC 2019]min 题目描述 给你一张 \(n\) 个点 \(m\) 条边的无向图,走过每条边都需要花费 \(1\) 秒. 给你一个整数 \(k\) ,请你选择至多 \(k\) 个点,令经过 ...
- IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习
2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...
- 【Linux】【Apatch Tomcat】Linux、CentOS7安装最新版Apartch Tomcat环境
1.前言 相当嫌弃,博客园搞掉了我快写完的 Tomcat. 请先安装 :[Linux][Java]CentOS7安装最新版Java1.8.191运行开发环境 虽然安装Tomcat没啥技术,但是还是记录 ...
- 【Python】【装饰器】
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- 【转载】【Pycharm编辑器破解步骤】之idea和Pycharm 等系列产品激活激活方法和激活码(附:Mac系统)
感谢:雪中皓月的<idea和Pycharm 等系列产品激活激活方法和激活码> 第一种方法:使用现有的注册服务器 优点:快捷,方便,省事 缺点:经常被封杀,可能会面临经常激活的困扰 Lice ...
- 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推
[北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面 [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...
- 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例
背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...
随机推荐
- CentOS7 安装 Docker、最佳Docker学习文档
目录 一.Docker支持 二.安装Docker -1.在新主机上首次安装Docker CE之前,需要设置Docker存储库.之后,就可以从存储库安装和更新Docker. 0.卸载旧版 1.正式安装 ...
- Elasticsearch7.3使用内置的JDK12
汇总:采用最简单的办法,就是在elasticsearch文件开头添加上这一行export JAVA_HOME=/home/vdb1/elastic_cluster/elasticsearch-7.3. ...
- redis - redis安装与启动
redis安装 下载redis安装包 wget http://download.redis.io/releases/redis-5.0.7.tar.gz 解压缩 tar -xzf redis-5.0. ...
- 【转载】C#中使用int.Parse方法将字符串转换为整型Int类型
在C#编程过程中,很多时候涉及到数据类型的转换,例如将字符串类型的变量转换为Int类型就是一个常见的类型转换操作,int.Parse方法是C#中专门用来将字符串转换为整型int的,int.Parse方 ...
- 单词dyamaund钻石dyamaund英语
dyamaund 英文词汇,中文翻译为金刚石的;镶钻;用钻石装饰 中文名:镶钻;钻石装饰 外文名:dyamaund 目录 释义 dyamaund 读音:[?da??m?nd, ?da?m?nd] ...
- VS调试 DataTable (转载)
调试的时候遇到一个问题:不知道怎么在自动窗口或者添加监视那里查看DataSet或者DataTable的具体的值.度娘了一下很多都是添加DataTable.Rows[][]监视,但是一行一列地看还是有点 ...
- CentOS7安装VNC
#安装 yum -y install tigervnc-server 将配置表复制到etc .service 修改配置文件 vim /etc/systemd/system/vncserver@\:.s ...
- Kali下的内网劫持(三)
前面两种说的是在Kali下的ettercap工具通过配合driftnet和urlsnarf进行数据捕获,接下来我要说的是利用Kali下的另外一种抓包分析工具——wireshark来进行捕获数据: 首先 ...
- OpenStack核心组件-nova计算服务
1. nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...
- admin端的教师管理功能测试
1 概述 1.1 测试范围 本次所测试的内容是admin端的教师管理功能. 1.2 测试方法 采用黑盒子方法进行集成测试. 1.3 测试环境 (1) 服务器l 操作系统:Windo ...