Description

link

题意:给一个全\(0\)矩阵,每次支持一个修改,修改不还原(这要是还原了不就成\(A\)题了)

然后询问每一次修改完了当前矩阵的连通块个数

每一个修改的值单调不降

修改次数 \(\leq 10^6\)

Solution

这个是一道并查集题(感觉我原来从来没有写过任何并查集维护信息的题目)

具体就是我们对于每一个修改要考虑的是这个修改带来的贡献,就是和相邻颜色的对比

能合并的就合并一下,然后统计答案

这时,我们把这个题转化成了对每一种颜色考虑,然后看这个颜色的改变(最后开个桶就成了)

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

逆序的原因是被覆盖的时候原先有的这个连通块可能被整成多个连通块

(如果我们逆序处理覆盖,就等同于正序处理添加,贡献相减即可)

真是一道并查集应用的不错题目

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
inline int read()
{
int res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k=='-') f=-1;
while(isdigit(k)) res=res*10+k-'0',k=getchar();
return res*f;
}
const int N=310,Q=2e6+10;
int fx[4]={0,-1,1,0},fy[4]={-1,0,0,1};
int n,m,q,maxx,ans[Q],fa[N*N],now[N][N];
struct query{int id,x,y;}; vector<query>q1[Q],q2[Q];
inline int num(int x,int y){return (x-1)*m+y;}
inline int rt(int x){return fa[x]==x?x:fa[x]=rt(fa[x]);}
inline bool in(int x,int y){return x>0&&x<=n&&y>0&&y<=m;}
inline void clear(int n){for(int i=1;i<=n;++i) fa[i]=i; return ;}
inline bool merge(int x,int y){x=rt(x),y=rt(y); if(x==y) return 0; return fa[x]=y,1;}
signed main()
{
n=read(); m=read(); q=read();
for(int i=1,x,y,c;i<=q;++i)
{
x=read(),y=read(),c=read(); maxx=c;
q2[now[x][y]].push_back((query){i,x,y});
q1[now[x][y]=c].push_back((query{i,x,y}));
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j) q2[now[i][j]].push_back((query){0,i,j});
}memset(now,-1,sizeof(now));
for(int i=0,sz,id,x,y;i<=maxx;++i)
{
sz=q1[i].size(); if(!sz) continue; clear(n*m);
for(int j=0;j<sz;++j)
{
id=q1[i][j].id; x=q1[i][j].x; y=q1[i][j].y;
now[x][y]=i; ++ans[id];
for(int k=0;k<4;++k)
{
int tx=x+fx[k],ty=y+fy[k];
if(in(tx,ty)&&now[tx][ty]==i) ans[id]-=merge(num(x,y),num(tx,ty));
}
}
}memset(now,-1,sizeof(now));
for(int i=0,sz,id,x,y;i<=maxx;++i)
{
sz=q2[i].size(); if(!sz) continue; clear(n*m);
for(int j=sz-1;j>=0;--j)
{
id=q2[i][j].id; x=q2[i][j].x; y=q2[i][j].y;
now[x][y]=i; --ans[id];
for(int k=0;k<4;++k)
{
int tx=x+fx[k],ty=y+fy[k];
if(in(tx,ty)&&now[tx][ty]==i) ans[id]+=merge(num(x,y),num(tx,ty));
}
}
}
ans[0]=1; for(int i=1;i<=q;++i) printf("%lld\n",ans[i]+=ans[i-1]);
return 0;
}
}
signed main(){return yspm::main();}

Codeforces1303F Number of Components的更多相关文章

  1. 【CF1151E】Number of Components

    [CF1151E]Number of Components 题面 CF 题解 联通块个数=点数-边数. 然后把边全部挂在较小的权值上. 考虑从小往大枚举左端点,等价于每次删掉一个元素,那么删去点数,加 ...

  2. CodeForces 1151E Number of Components

    题目链接:http://codeforces.com/problemset/problem/1151/E 题目大意: n个人排成一个序列,标号为 1~n,第 i 个人的学习成绩为 ai,现在要选出学习 ...

  3. Codefores 1151E Number of Components

    大意:给定n元素序列$a$, $1\le a_i \le n$, 定义函数$f(l,r)$表示范围在$[l,r]$以内的数构成的连通块个数, 求$\sum\limits_{i=1}^{n}\sum\l ...

  4. cf1151e number of components

    很常见的思想:将整体求改为统计每个部分的贡献 本题中统计[l, r]时, 每个连通块有一个重要特征, 最右端的数在[l,r]中而下一个数不在(好像是句废话 那么我们分别考虑每个点对连通块的贡献, 即它 ...

  5. [CF1303F] Number of Components - 并查集,时间倒流

    有一个 \(n \times m\) 矩阵,初态下全是 \(0\). 如果两个相邻元素(四连通)相等,我们就说它们是连通的,且这种关系可以传递. 有 \(q\) 次操作,每次指定一个位置 \((x_i ...

  6. Codeforces 1270H - Number of Components(线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 首先需发现一个性质,那就是每一个连通块所对应的是一个区间.换句话说 \(\forall l<r\),若 \(l,r\) 在同一连通块 ...

  7. [翻译]Writing Custom Report Components 编写自定义报表组件

    摘要:简单介绍了如何编写一个FastReport的组件,并且注册到FastReport中使用.   Writing Custom Report Components 编写自定义报表组件 FastRep ...

  8. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  9. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

随机推荐

  1. C++基础--引用的一点补充

    这一篇是对引用的一点补充,内容基本上是来自<C++ primer plus>一书第八章的内容. 前面一篇介绍了引用的一点特点,这里补充一个,将引用用于类对象的时候,有一个体现继承的特征,就 ...

  2. 下页小希学MVC5+EF6.2 学习记录三

      目的:1 学习mvc+ef 2  写下日记也是对自己的督促 期待已久的EF终于来了. 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型 ...

  3. java课程之团队开发冲刺阶段2.6

    总结昨天进度: 1.总体的思路已经完成,代码也差不多了,只剩下对闹钟activity的设置 遇到的困难: 1.在设置震动的时候,对方法有点不太理解,所以使用的时候产生了错误,没有达到预期的效果 今天的 ...

  4. 【机器学习实战学习笔记(1-2)】k-近邻算法应用实例python代码

    文章目录 1.改进约会网站匹配效果 1.1 准备数据:从文本文件中解析数据 1.2 分析数据:使用Matplotlib创建散点图 1.3 准备数据:归一化特征 1.4 测试算法:作为完整程序验证分类器 ...

  5. Swift之分割视图控制器-UISplitViewController

    Swift之分割视图控制器-UISplitViewController UISplitViewController这种控制器只能用于iPad,它可以在iPad屏幕中显示两个不同的场景:在横向模式下,左 ...

  6. CentOS 7 连接不到网络解决方法

    使用VM12创建虚拟机并安装CentOS 7,但是安装完成后发现连接不到网络. ping jd.com发现不通 因为在创建虚拟机的时候我们选择的是NAT模式 这里给出NAT模式下对应的的解决方法: 一 ...

  7. 自己组装一台1U服务器

    视频资料链接 自己组装一台1U服务器 执行思路: 1.评估访问了,根据需求确定服务器要求 2.根据要求选择硬件:冗余.稳定等 3.搜索主流服务器参数进行对比,及对比价格 4.咨询IDC机房价格 DIY ...

  8. Maven:Failed to read artifact descriptor for xxx

    Maven多模块项目jar包引用问题: Failed to execute goal on project xxx-service: Could not resolve dependencies fo ...

  9. SQL Server 2017 安装问题

    遇到问题 Polybase 要求安装 Oracle JRE7 更新 规则失败 安装完毕之后,登录提示:您试图连接的 SQL Server 实例未安装 安装完SQL Server 2017 后,无法启动 ...

  10. arp攻击 (可查看同一局域网他人手机照片)

    国家法律一定要遵守,知识要用在对的地方. 本贴只为了和大家交流学习,请勿用在其他地方,损害任何人的利益. 今天我,来说一下arp攻击的原理和教程 原理什么的还是自行百度好,因为专业的说明是严谨而又经得 ...