2022.02.27 CF811E Vladik and Entertaining Flags
2022.02.27 CF811E Vladik and Entertaining Flags
https://www.luogu.com.cn/problem/CF811E
Step 1 题意
在一个 n*m 的网格上每个格子都有颜色,q 次询问,每次询问只保留 l 至 r 列时有多少个四连通的颜色块。两个格子同色但不连通算在不同的颜色块内。
Step 2 分析
这道题我首先大力找到一个错误规律,这个暂且不说,直接上正解。
对于每一列的格子搞线段树,记录每列有几个连通块,每列的最左侧和最右侧的节点属于哪个连通块。
合并的时候合并两个连通块相邻的两列,如果颜色一致并且fa不一样,总连通块的数量减一。不过需要初始化一下相邻两列格子的并查集。
Step 3 代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,q,mapi[15][N],fa[N*15];
int tot;
struct node{
int x,y,L[15],R[15],sum;
}t[N<<4];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
inline node update(node x,node y,int l,int r){
node ans;
ans.sum=x.sum+y.sum;
for(int i=1;i<=n;i++)
fa[x.L[i]]=x.L[i],fa[x.R[i]]=x.R[i],
fa[y.L[i]]=y.L[i],fa[y.R[i]]=y.R[i];
for(int i=1;i<=n;i++)ans.L[i]=x.L[i],ans.R[i]=y.R[i];
for(int i=1;i<=n;i++)
if(mapi[i][l]==mapi[i][r]){
int xi=find(fa[x.R[i]]);
int yi=find(fa[y.L[i]]);
if(xi!=yi)fa[xi]=yi,--ans.sum;
}
for(int i=1;i<=n;i++)
ans.L[i]=find(ans.L[i]),ans.R[i]=find(ans.R[i]);
return ans;
}
inline void build(int x,int l,int r){
if(l==r){
for(int i=1;i<=n;i++)
if(mapi[i][l]==mapi[i-1][l])
t[x].L[i]=t[x].R[i]=t[x].L[i-1];
else t[x].L[i]=t[x].R[i]=++tot,++t[x].sum;
return ;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
t[x]=update(t[x<<1],t[x<<1|1],mid,mid+1);
}
inline node query(int x,int l,int r,int L,int R){
if(l>=L&&r<=R)return t[x];
int mid=(l+r)>>1;
int flaga=0,flagb=0;
node a,b,ans;
if(L<=mid)a=query(x<<1,l,mid,L,R),flaga=1;
if(R>mid)b=query(x<<1|1,mid+1,r,L,R),flagb=1;
if(flaga&&!flagb)ans=a;
else if(flagb&&!flaga)ans=b;
else if(flaga&&flagb)ans=update(a,b,mid,mid+1);
return ans;
}
signed main(){
n=read();m=read();q=read();
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)mapi[i][j]=read();
//cout<<"Case 1 "<<endl;
build(1,1,m);
//cout<<"Case 2 "<<endl;
for(int i=1;i<=q;i++){
int u,v;
u=read();v=read();
node fin=query(1,1,m,u,v);
cout<<fin.sum<<endl;
}
return 0;
}
2022.02.27 CF811E Vladik and Entertaining Flags的更多相关文章
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- CF811E Vladik and Entertaining Flags
嘟嘟嘟 看题目这个架势,就知道要线段树,又看到维护联通块,那就得并查集. 所以,线段树维护并查集. 然而如果没想明白具体怎么写,就会gg的很惨-- 首先都容易想到维护区间联通块个数和区间端点两列的点, ...
- codeforces 811E Vladik and Entertaining Flags(线段树+并查集)
codeforces 811E Vladik and Entertaining Flags 题面 \(n*m(1<=n<=10, 1<=m<=1e5)\)的棋盘,每个格子有一个 ...
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
Vladik and Entertaining Flags Time Limit: 20 Sec Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...
- Vladik and Entertaining Flags
Vladik and Entertaining Flags time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...
- codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)
题目链接:http://codeforces.com/contest/811/problem/E 题意:给定一个行数为10 列数10w的矩阵,每个方块是一个整数, 给定l和r 求范围内的联通块数量 所 ...
- ROS的安装-> rosdep init /update报错2022.02.24实测有效
ROS的安装-> rosdep init /update报错2022.02.24实测有效 一. 解决rosdep_init问题 正常执行sudo rosdep init会报错,如下: ERR ...
- 2022.02.21 UB
2022.02.21 UB 参考资料: https://zhuanlan.zhihu.com/p/141467895 https://blog.csdn.net/ghscarecrow/article ...
随机推荐
- SQL语句优化、mysql不走索引的原因、数据库索引的设计原则
SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...
- 4月8日 python学习总结 模块与包
一.包 #官网解释 Packages are a way of structuring Python's module namespace by using "dotted module n ...
- sftp服务器搭建以及挂载新硬盘到home目录下
前言 我身边一直有一个空闲不用的硬盘,一直空闲不用,闲暇的时候想到为什么不用起来呢,于是想起来搭建一个sftp服务器,当做云盘用了 搭建sftp服务器 SFTP称作"安全的FTP" ...
- java打入jar包
首先在项目下创建一个文件夹,保存我们的jar包. 在项目名上右击,依次点击[New]-->[Floder],打开新建文件夹窗口 输入文件夹名称[lib],点击[ok].我们通常在lib文件夹中存 ...
- Kafka 的设计架构你知道吗?
Producer :消息生产者,就是向 kafka broker 发消息的客户端. Consumer :消息消费者,向 kafka broker 取消息的客户端. Topic :可以理解为一个队列,一 ...
- 什么是 DAO 模式?
DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了 抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访 问操作.在实际的开发中,应该将所有对 ...
- @Qualifier 注解 ?
当有多个相同类型的 bean 却只有一个需要自动装配时,将@Qualifier 注解和 @Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的 bean.
- 学习GlusterFS(五)
一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...
- H5进阶篇--实现微信摇一摇功能
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...
- 前端webpack workflow(二)——Webpack基本使用
作者:Jogis原文链接:https://github.com/yesvods/Blog/issues/3转载请注明原文链接以及作者信息 前一篇文章介绍了webpack以及安装方法,这次将会介绍web ...