题目

一\(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的更多相关文章

  1. 【JOISC2018|2019】【20190622】minerals

    题目 交互题 有\(2n\)个物品,编号为\(1-2n\),存在唯一的两两配对关系,即有\(n\)种物品 有一个盒子,初始为空,盒子上会显示里面存在的物品种类数\(C\) 你每次操作可以将一个物品从盒 ...

  2. 【FJWC 2019】 森林

    [FJWC 2019] 森林 样例输入 0 5 1 0 0 2 样例输出 1 2 3 3 我们发现,答案就是直径加上直径上某个点出发,不经过其他直径上的点的最长链.这里的直径可以是任意一条直径. 首先 ...

  3. 【FJWC 2019】min

    [FJWC 2019]min 题目描述 给你一张 \(n\) 个点 \(m\) 条边的无向图,走过每条边都需要花费 \(1\) 秒. 给你一个整数 \(k\) ,请你选择至多 \(k\) 个点,令经过 ...

  4. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  5. 【Linux】【Apatch Tomcat】Linux、CentOS7安装最新版Apartch Tomcat环境

    1.前言 相当嫌弃,博客园搞掉了我快写完的 Tomcat. 请先安装 :[Linux][Java]CentOS7安装最新版Java1.8.191运行开发环境 虽然安装Tomcat没啥技术,但是还是记录 ...

  6. 【Python】【装饰器】

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  7. 【转载】【Pycharm编辑器破解步骤】之idea和Pycharm 等系列产品激活激活方法和激活码(附:Mac系统)

    感谢:雪中皓月的<idea和Pycharm 等系列产品激活激活方法和激活码> 第一种方法:使用现有的注册服务器 优点:快捷,方便,省事 缺点:经常被封杀,可能会面临经常激活的困扰 Lice ...

  8. 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推

    [北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面  [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...

  9. 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例

    背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...

随机推荐

  1. C# vb .net实现拉伸效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的拉伸效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  2. Linux中解压、压缩 ZIP文件

    解压 unzip -o -d /home/v-gazh myfile.zip # 把myfile.zip文件解压到 /home/v-gazh/ # -o:不提示的情况下覆盖文件: # -d:-d /h ...

  3. IDEA和Eclipse启动优化

    昨天对比了下IDEA和Eclipse的启动速度,发现IDEA启动真的是好慢啊!!! 电脑配置:8G win7 IDEA启动配置 -Xms1024m -Xmx1024m -Xmn500m -XX:Met ...

  4. 又一个js乱码的秘密alert放在js文件里中文乱码,可是放在HTML里显示中文就很好

    用文本文档打开你的js文件,文件-另存为,编码更改为UTF-8保存. 回复 | PFly | 园豆:94 (初学一级) | 2017-07-17 21:32 显示结果中文乱码 支持(0)反对(0)回复 ...

  5. 数据仓库模型ETL架构(DWI/DWR/DM)

    1.DWI DWI:数据湖.数据砥柱,一般存放在HDFS 数据仓库的基础数据来源,各种杂七杂八的数据 关键点:数据清洗.数据整合.异常处理.增量获取 ETL:E-数据抽取.数据清洁.格式转换,T-生成 ...

  6. Firebird 事务隔离级别

    各种RDBMS事务隔离都差不多,Firebird 中大致分为3类: CONCURRENCY.READ_COMMITTED.CONSISTENCY. 在提供的数据库驱动里可设置的事务隔离级别大致如下3类 ...

  7. oracle 数据库导入导出语句

    oracle的exp/imp命令用于实现对数据库的导出/导入操作;exp命令用于把数据从远程数据库服务器导到本地,生成.dmp文件;imp命令用于把本地的数据库.dmp文件从本地导入到远程的oracl ...

  8. JanusGraph多图配置 (cassandra)

    JanusGraph多图配置目的 :一个端口开启后可根据句柄操作多个图 .(cassandra存储后端) 1.GremlinServer多图配置 服务器gremlin-server.yaml中可以设置 ...

  9. filter-mutate过滤插件

    之前的nginx日志使用grok匹配,但是后来发现nginx的日志中每个值之间都使用了分隔符"|",这下就可以使用mutate来分隔出每个字段的含义,同时还减少了运算. 描述 mu ...

  10. https://www.runoob.com/linux/mysql-install-setup.html

    https://www.runoob.com/linux/mysql-install-setup.html