这道题通过dfs暴力统计初始军团数是常规操作,此题难点在于之后的修改操作,我们可以用vector记录下每种颜色存在的位置,然后枚举要更改的颜色位置,每个位置原来对于答案的贡献是和他相邻不同色的节点个数,我们减去原来的答案加上更改后的答案就得到了当前的答案。然后再暴力合并vector就可以解决问题,然而这种解法会T掉,我们考虑优化合并操作,我们能发现把x变成y和把y变成x得到的答案是相同的,所以我们在合并的时候以及更改颜色的时候都是把颜色少的改成颜色多的,并且维护每种颜色实际的vector是哪个,这样一来可以把常数降低好几倍,也就是所谓的启发式合并。维护每种颜色实际的vector方法和并查集比较像,比较容易实现。

代码如下

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
vector<int> g[maxn];
vector<int> num[maxn];
int v[maxn];
int col[maxn];
int cnt;
int mp[maxn];
void dfs(int x)
{v[x]=true;num[col[x]].push_back(x);for(int i=0;i<g[x].size();i++){int now=g[x][i];if(!v[now]){if(col[now]&&col[now]!=col[x])cnt++;dfs(now);}}
}
void work(int &x,int &y)
{if(num[x].size()>num[y].size())swap(x,y);for(int i=0;i<num[x].size();i++){int now=num[x][i];for(int j=0;j<g[now].size();j++){int t=g[now][j];if(col[t]&&col[t]!=x)cnt--;}}for(int i=0;i<num[x].size();i++){int now=num[x][i];col[now]=y;num[y].push_back(now);}for(int i=0;i<num[x].size();i++){int now=num[x][i];for(int j=0;j<g[now].size();j++){int t=g[now][j];if(col[t]&&col[t]!=y)cnt++;}}num[x].clear();x=-1;
}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>col[i];for(int i=1;i<=n;i++)mp[i]=i;int x,y;for(int i=1;i<n;i++){cin>>x>>y;g[x].push_back(y);g[y].push_back(x);}cnt=(col[1]==0?0:1);dfs(1);for(int i=1;i<=m;i++){cin>>x>>y;if(mp[y]==-1)mp[x]=-1,mp[y]=x;else if(mp[x]!=-1&&mp[x]!=mp[y])work(mp[x],mp[y]);cout<<cnt<<endl;}return 0;
}

牛客寒假算法集训营1 小a与军团模拟器(启发式合并)相关推荐

  1. 小a与204(牛客寒假算法集训营1题目B)

    链接:https://ac.nowcoder.com/acm/contest/317/B 来源:牛客网 时间限制:C/C++ 1秒, 其他语言2秒 空间限制: C/C++ 262144K,其他语言52 ...

  2. 2023牛客寒假算法集训营3

    (数学场真折磨人) A. 不断减损的时间(贪心) 题意: 给定一个数组,任意次操作,每次操作可以 选择一个偶数除以 222 . 求最终数组所有元素之和的最小值. 思路: 要使得所有元素之和最小,那肯定 ...

  3. 牛客寒假基础集训营 | Day1 D题—hanayo和米饭

    一. 题目描述 hanayo很喜欢吃米饭. 有一天,她拿出了 个碗,第一个碗装了 1 粒米饭,第二个碗装了 2 粒米饭,以此类推,第 n 个碗装了 n 粒米饭. 然而,爱搞恶作剧的rin把所有的碗的顺 ...

  4. 牛客寒假基础集训营 | Day1 E题—rin和快速迭代

    一. 题目描述 二. 测试用例 三. 代码 #include <iostream> using namespace std; #include <math.h>long lon ...

  5. 2023牛客寒假算法基础集训营1_20230116「典dp」「典set」「小思维+bfs」「小思维+构造+码力」「位运算博弈(人类智慧)」

    6/13 打得不好,这两天家里也很不好,跟做梦一样,脑子好像被僵尸吃掉了,前两个小时胡乱瞎写交题只过样例,wa了再看,什么b错都能写出来. M. M-本题主要考察了找规律_2023牛客寒假算法基础集训 ...

  6. 2021牛客寒假算法基础集训营1 J 一群小青蛙呱蹦呱蹦呱

    今天的比赛没打( 睡午觉去了,今天太累了 晚上来看看题 2021牛客寒假算法基础集训营1 J 一群小青蛙呱蹦呱蹦呱 题目传送门 板子题( 我们知道由唯一分解定理得,若 n=p1α1×p2α2×p3α3 ...

  7. 2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)

    1.I-A+B问题 模拟,类似于高精度,竖式运算 #include<bits/stdc++.h> using namespace std; typedef long long LL; in ...

  8. 2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

    1.A-智乃的Hello XXXX 签到 #include<bits/stdc++.h> using namespace std; int main(){cout<<" ...

  9. 2023牛客寒假算法基础集训营4_20230130「向上取整」「夹逼dp」「lowbit科学+树状数组性质」「搜索」「倍增跳表」「莫队」

    6/13 教育场是有被教育到.(预计会鸽几题. 已过非太水的题们 //B //https://ac.nowcoder.com/acm/contest/46812/B//小构造小数学#include & ...

  10. 【解题报告】2021牛客寒假算法基础集训营4

    [解题报告]2021牛客寒假算法基础集训营4 前面的话 A :九峰与签到题 | 模拟 (签到题) B: 武辰延的字符串 | exKMP D :温澈滢的狗狗 | 二分 E: 九峰与子序列 | d p d ...

最新文章

  1. tongweb安装部署_Linux系统东方通部署iserver说明
  2. CentOS7安装bbr的正确姿势:更新到7.3,安装elrepo官方4.9正式版
  3. 对pthread_cond_wait()函数的理解
  4. 使用phpstorm+wamp实现php代码实时调试审计
  5. php 分析css,全面分析css属性选择器
  6. rocketmq java例子_SpringBoot和RocketMQ的简单实例
  7. 键盘与鼠标器是微型计算机上最常用的,2016年职称计算机考试WindowsXP考前预测试题5...
  8. tp5 database.php,Tp5项目修改数据库
  9. 不想让别人的闪盘或者移动硬盘在自己的电脑上识别
  10. CISP考试真题,CISP测试题
  11. C# 调用打印机驱动实现打印功能
  12. 键 -- 主键、候选键、可选键
  13. python基础题目练习,购买猕猴桃
  14. 了解 InfoPath 2007十大优势
  15. CSDN博客第一期云计算最佳博主评选
  16. c++ 不撞南墙不回头——树形动态规划(树规)
  17. java开发工程师培训费,南通渡课Java开发工程师培训费用是多少
  18. FILCO:蓝牙键盘配对教程
  19. IOS开发-Nsstring中搜索方法rangeOfString
  20. excel shell合成_shell快速合并多个Excel表格

热门文章

  1. Windows批处理文件bat学习(一)
  2. grep -E 即 egrep 匹配多个
  3. 副词(Adverb 简称adv.)
  4. 未检测到正确安装的网络适配器_网络适配器图标出现黄色感叹号的解决办法
  5. linux系统的系统命令大全,linux系统命令大全
  6. SNS:六度分隔理论
  7. 排队器拦截_如何绕过浏览器的弹窗拦截机制
  8. php课程设计感想,设计心得体会
  9. Apache Ant官网下载、安装及环境变量配置过程详细图文说明(以windows系统为例)
  10. python 什么是原类_python中什么是类