codeforces1303 F. Number of Components(并查集+添_正序、删_逆序)

F. Number of Components

并查集,每次修改考虑的是这个修改带来的贡献,就是和相邻颜色的对比,如果不考虑先不考虑颜色覆盖,那么添加颜色首先会产生一个新的连通块,然后考虑合并,每合并一次就会减少一个连通块。

题目转化成了对每一种颜色考虑,然后看这个颜色的改变。

对于每种颜色,会有两种:添加一个颜色(正序处理),颜色被覆盖(逆序处理)

而对于颜色被覆盖,只需要逆序考虑即可。每次只考虑贡献,因此最终要求个前缀和。

#include<bits/stdc++.h>using namespace std;constexpr int N=310,M=2000010;
int fa[2*M];
int n,m,k;
int id[N][N],idx;
int a[N][N],cur;
int ans[M];
struct node
{int x,y;int fr,to;
}q[M];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y)
{x=find(x),y=find(y);if(x==y) return;fa[x]=y; cur--;
}
void solve(int x,int y)// 由于边界都设为-1 不用考虑出界问题
{if(a[x][y]==a[x-1][y]) merge(id[x][y],id[x-1][y]);if(a[x][y]==a[x+1][y]) merge(id[x][y],id[x+1][y]);if(a[x][y]==a[x][y-1]) merge(id[x][y],id[x][y-1]);if(a[x][y]==a[x][y+1]) merge(id[x][y],id[x][y+1]);
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m>>k;// 询问for(int i=1;i<=k;i++){int x,y,c;cin>>x>>y>>c;q[i]={x,y,a[x][y],c};a[x][y]=c;}memset(a,0xff,sizeof a);//边界设为-1for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=0;//最开始为被询问的编号都默认为0 父亲也是0for(int i=1;i<=k;i++)if(q[i].fr!=q[i].to)// 如果改变颜色{cur=1;// 新产生的连通块a[q[i].x][q[i].y]=q[i].to;id[q[i].x][q[i].y]=++idx;fa[idx]=idx;solve(q[i].x,q[i].y);// 合并一次 cur--ans[i]+=cur;}// 正着做完后a已经是最终的状态idx=0;for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {id[i][j]=++idx;fa[idx]=idx;}for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) solve(i,j);// 逆着在做一次for(int i=k;i>=1;i--)if(q[i].fr!=q[i].to){cur=1;a[q[i].x][q[i].y]=q[i].fr;id[q[i].x][q[i].y]=++idx;fa[idx]=idx;solve(q[i].x,q[i].y);ans[i]-=cur;}ans[0]=1;//最开始的图连通块个数为1for(int i=1;i<=k;i++) ans[i]+=ans[i-1];for(int i=1;i<=k;i++) cout<<ans[i]<<'\n';return 0;
}

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

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

相关文章

内部设计师揭秘!王者峡谷中竟有隐藏的c++代码??!!腾讯已经炸了!!!

解析 模拟的时候用关于n的一元二次方程实根公式解的不亦乐乎。。。后来经高人提醒才发现万物皆为斐波拉契。。 就很《离谱》 于是代码就不难了 也算有收获吧&#xff0c;遇到这种看起来莫名其妙的题时&#xff0c;不着急死磕&#xff0c;可以先写个上图一样的程序找找规律 “实…

.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

写在前面上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它&#xff0c;接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目&#xff0c;同时又通过一个实战教你如何在页面显示一个Content的列表。不知道你有没有跟着敲下代码&#xff0c…

P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P5305 题目大意 给一棵有根树和kkk&#xff0c;QQQ次询问给出x,yx,yx,y求 ∑i1xdepLCA(i,y)k\sum_{i1}^{x}dep_{LCA(i,y)}^ki1∑x​depLCA(i,y)k​ 1≤n,Q≤5105,1≤k≤1091\leq n,Q\leq 5\times 10^5,1\leq k\leq 10^91≤n,…

牛客题霸 [二叉树的镜像]C++题解/答案

牛客题霸 [二叉树的镜像]C题解/答案 题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 题解&#xff1a; 根据题也不难看出&#xff0c;二叉树的镜像定义其实就是左右树翻转 所以我们一直递归左子树&#xff0c;到头后递归右子树&#xff0c;开始翻转&…

2021牛客暑期多校训练营1 G-Game of Swapping Numbers(最优解转化+贪心)

G-Game of Swapping Numbers 讲题人做法 最优解转化&#xff1a; 考虑任意一个最优解&#xff0c;我们把交换后的数字重新放回原来的位置&#xff0c;相当于为每一个元素分配了它在答案中的符号。比如 A{0, 3}, B {1, 2}&#xff0c;最优解符号分配是 A{-0,3}, B{-1,2}。 …

不止代码:导弹拦截

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于该系统…

对.NET Core未来发展趋势的浅层判断

经常听到园里.NET开发人员在抱怨生态不如JAVA&#xff0c;想要转JAVA&#xff0c;所谓打不过你&#xff0c;我就加入你&#xff01;杜兰特的思维方式固然是获取总冠军的一种方式&#xff0c;但是我们要关起门来问自己有没有杜兰特的实力。用开发生态来类比NBA不是特别恰当&…

AT2567-[ARC074C]RGB Sequence【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2567 题目大意 长度为nnn的包含三种颜色RGBRGBRGB的序列&#xff0c;mmm个限制[l,r,k][l,r,k][l,r,k]表示区间l∼rl\sim rl∼r恰好有kkk种颜色。 求方案数 1≤n≤3001\leq n\leq 3001≤n≤300 解题思路 很水的题是吧&…

牛客题霸 [字符串变形]C++题解/答案

牛客题霸 [字符串变形]C题解/答案 题目&#xff1a; 对于一个给定的字符串&#xff0c;我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格&#xff0c;就像"Hello World"一样&#xff0c;然后我们要做的是把着个字符串中由空格隔…

2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)

H-Hash Function Shining_xzl大佬题解 本题答案符合题意的充分必要条件是&#xff1a;不能是任意两个数的差以及他们的因数&#xff0c;因此只需用用FFT求出这些数的差&#xff0c;记为差的集合。 从小到大考虑一个答案&#xff0c;以及答案的倍数是不是上述差的集合&#x…

priority_queue+贪心:运输(题解)

解析 不难发现每次都应合并最大的一对&#xff0c;从而使局部最优带动整体最优 sort就会很自然的想到 但是问题是合并完之后的新值可能已经不是当前最大了&#xff08;WA。。qwq&#xff09; 于是想到每次循环sort一遍&#xff0c;结果n^2logn又超时了。。。 在一位高人的指引…

【话题揭秘】某大型国有银行的敏捷落地实践

“某大型国有银行的敏捷落地实践”话题介绍银行行业是强烈依赖IT的非IT行业&#xff0c;传统金融要想打破现有局面&#xff0c;除了要解决外因&#xff0c;还要突破内部因素&#xff0c;其中一点就是技术重塑和战略手段&#xff0c;也就是常说的数字化转型&#xff0c;这也是经…

P3293-[SCOI2016]美味【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3293 题目大意 给出一个长度为nnn的序列&#xff0c;mmm次询问给出b,x,l,rb,x,l,rb,x,l,r表示询问在[l,r][l,r][l,r]中找到一个数字aaa使得bxor(ax)b\ xor\ (ax)b xor (ax)的值最大。 1≤n,m≤2105,0≤a,b,x<1051\leq n,…

牛客题霸 [三个数的最大乘积]C++题解/答案

牛客题霸 [三个数的最大乘积]C题解/答案 题目描述 给定一个无序数组&#xff0c;包含正数、负数和0&#xff0c;要求从中找出3个数的乘积&#xff0c;使得乘积最大&#xff0c;要求时间复杂度&#xff1a;O(n)&#xff0c;空间复杂度&#xff1a;O(1)。 题解&#xff1a; 有…

震惊!温州一程序员编完八皇后吐血而亡,他的代码是什么样子?!!

解析 经典大法师&#xff08;dfs哈哈哈&#xff09; 比较关键的是每条对角线上点的坐标之和或差是相同的&#xff0c;故可以用一维数组存储其状态 这题一开始用了双层循环&#xff0c;卡掉了4个点qwq 后来发现其实因为每行只有一个皇后&#xff0c;每次单层循环枚举j就可以实…

codeforces1498 D. Bananas in a Microwave(背包+优化)

D. Bananas in a Microwave issue是fw题解 设计dp&#xff1a; 状态表示&#xff1a;fi,jf_{i,j}fi,j​表示&#xff1a;前iii个操作是否能够凑成jjj。 状态转移&#xff1a;第iii次操作枚举操作次数考虑是否凑成val\text{val}val&#xff0c;如果第i−1i-1i−1次操作也可以凑…

直播视频发布:Windows上的Linux容器和Azure混合云中的Kubernetes(k8s)

如果你还没有开始关注容器&#xff0c;那么你已经out了&#xff1b;如果你还在单机上运行容器&#xff0c;那么你out了。经过2013到2018年5年的演化&#xff0c;分化和进化&#xff1b;容器&#xff0c;Docker和Kubernetes已经是任何一家企业的IT解决方案都不能忽视的重要趋势。…

ARC122C-Calculator【乱搞,构造】

正题 题目链接:https://atcoder.jp/contests/arc122/tasks/arc122_c 题目大意 一个数对开始是(0,0)(0,0)(0,0)&#xff0c;每次可以选择一个数加一或者让一个数加上另一个数&#xff0c;求使得第一个数变成nnn的方案。步数不超过130130130。 1≤n≤10181\leq n\leq 10^{18}1≤…

牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案

牛客题霸 [将升序数组转化为平衡二叉搜索树]C题解/答案 题目描述 给出一个升序排序的数组&#xff0c;将其转化为平衡二叉搜索树&#xff08;BST&#xff09;. 题解&#xff1a; 二叉搜索树的定义&#xff1a; 二叉搜索树或者是一棵空树&#xff0c;或者是具有下列性质的二…

日志:贪心

排队接水 时间限制: 1 Sec 内存限制: 128 MB 题目描述 有n 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为ti &#xff0c;请编程找出这n 个人 排队的一种顺序&#xff0c;使得n 个人的平均等待时间最小。 输入 第一行为n(1<n<5000)。第二行分别表示第1…