【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版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...
随机推荐
- 如何在ArcGIS饼状图中下方添加文字
内容源自:ArcGIS10.2基础教程(丁华) 书上要求在统计图的饼状图下方显示“总面积组成”,以及图例是只显示文字. 该如何操作呢? 其实就是在高级属性中选择标题-副标题-显示“总面积组成”即可 而 ...
- oracle 分页sql
select * from ( SELECT A.*, ROWNUM RN FROM ( SELECT A.*,B.USERPWiD from 测试表2 A left join 测试表3 B on A ...
- Web网站实现Google登录
一.打开谷歌控制台:https://console.developers.google.com/apis 二.点击创建凭据,如下图,填写项目地址等 三.创建好客户端ID和秘钥后,填写对应的项目网址和登 ...
- redux核心知识
Provider 作用:把父组件传递进来的store对象放入react 上下文中,这样connect组件就可以从上下文中获取到store对象 Connect 作用: 1.从react上下文中取出s ...
- Java 单例类
单例类:该类只能创建一个实例,或者说内存中只有一个实例,该类的对象引用的都是这个实例. 示例: package my_package; //定义一个单例类 class Singleton{ //使用一 ...
- 使用Prometheus针对自己的服务器采集自定义的参数
用一个简单的例子来说明. 我用express和http搭了一个最简单的服务器,监听在8081端口上. 在metrics endpoint上,我会打印出这个服务器从启动至今,服务了多少次请求.这里我只是 ...
- Python学习笔记-字符串与注释
OSX从Pthon 2.7升级到3.8 1,官网下载最新安装包安装 2,执行认证文件command 3,执行设置path command 4,设置默认python 在terminal里运行open ...
- MySQL Lock--MySQL INSERT加锁学习
准备测试数据: ## 开启InnoDB Monitor SET GLOBAL innodb_status_output=ON; SET GLOBAL innodb_status_output_lock ...
- Linux下设置postgresql数据库开机启动
PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下,linux文件即为linux系统上的启动脚本: 1.将Linux文件复制到 /e ...
- 使用opencv去操作树莓派摄像头保存图片和视频
利用树莓派的摄像头去学习opencv的基本操作 —— 保存图片和视频 1.使用Opencv去控制树莓派的摄像头拍照并保存到本地,主要使用cv2和numpy库 #!/usr/bin/python3 # ...