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 Step 1 题意 在一 ...
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
Vladik and Entertaining Flags Time Limit: 20 Sec Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...
- Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...
- codeforces 811E Vladik and Entertaining Flags(线段树+并查集)
codeforces 811E Vladik and Entertaining Flags 题面 \(n*m(1<=n<=10, 1<=m<=1e5)\)的棋盘,每个格子有一个 ...
- CF811E Vladik and Entertaining Flags
嘟嘟嘟 看题目这个架势,就知道要线段树,又看到维护联通块,那就得并查集. 所以,线段树维护并查集. 然而如果没想明白具体怎么写,就会gg的很惨-- 首先都容易想到维护区间联通块个数和区间端点两列的点, ...
- codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)
题目链接:http://codeforces.com/contest/811/problem/E 题意:给定一个行数为10 列数10w的矩阵,每个方块是一个整数, 给定l和r 求范围内的联通块数量 所 ...
- Vladik and Entertaining Flags
Vladik and Entertaining Flags time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]
P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...
- 2018.11.02 NOIP模拟 飞越行星带(最小生成树/二分+并查集)
传送门 发现题目要求的就是从下到上的瓶颈路. 画个图出来发现跟去年noipnoipnoip提高组的奶酪差不多. 于是可以二分宽度+并查集检验,或者直接求瓶颈. 代码
随机推荐
- cute
环境准备 将靶机导入后将网络设置为NAT kali:192.168.0.102 cute:192.168.0.107 端口扫描 使用nmap对靶机进行端口扫描 nmap –A –p- 192.168. ...
- ESP8266 NodeMCU引脚说明,CH340和CP2102两款
开发ESP8266 NodeMCU GPIO功能时,虽然知道ESP8266 NodeMCU丝印引脚编号如下图所示(CP2102款),但是和实际对应的GPIO编号完全不一样. CP2102款 引脚说 ...
- BIO、NIO、AIO的区别
一.基本概念 1.BIO:同步阻塞IO 2.NIO:同步非阻塞IO 3.AIO:异步阻塞IO IO操作包括两部分,发起IO请求.IO数据读写.阻塞非阻塞主要针对线程发起IO请求之后是否立即返回来定义的 ...
- MyBatis 实现一对一有几种方式?具体怎么操作的?
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成: 嵌套查询是先查一个表,根据这个表里面的结果的 ...
- 学习Redis(一)
一.NoSQL 1.NoSql介绍 1.not only SQL,非关系型数据库,它能解决常规数据库的并发.IO与性能的瓶颈 2.解决以下问题: ① 对数据库的高并发读写需求 ② 大数据的高效存储和访 ...
- Linux下的cman中文帮助手册配置
Linux下的帮助命令man功能很强大,很好用,但显示的结果是英文,有时候看着还是吃力,就想着要是有man的中文显示结果该多好.网上搜寻一番后,终于找到解决方案,很简单,亲测有效.具体步骤如下: su ...
- Altium design16设计技巧
第一栏:共有界面 1.在原理图和PCB都打开的情况下,选中原理图可以对应到PCB界面元件里面 第二栏:原理图界面 1.批量改变元件属性 选择某一元件-查找相似对象-将其要改变的内容设置为same-点击 ...
- 付费漫画下载、付费韩漫下载、漫画VIP下载、VIP韩漫下载哪里下
需要的 来qq:6686496 最近迷上了韩漫(你懂的),主要为了打发时间上班摸鱼,,找了好多网站都是要收费的,就想着试着用爬虫做一个破解. 最简单的第一步,通过url分析出漫画ID.(直接看url就 ...
- 深入理解 flex-grow & flex-shrink & flex-basis
前言 flex 有三个属性值,分别是 flex-grow, flex-shrink, flex-basis,默认值是 0 1 auto. 发现网上详细介绍他们的文章比较少, 今天就详细说说他们,先一个 ...
- 小程序 wx.getSystemInfoSync 获取 windowHeight 问题
windowHeight 概念 可使用窗口高度,即:屏幕高度(screenHeight) - 导航(tabbar)高度 存在问题 安卓设备下获取 windowHeight 不能准确得到对应的高度,总是 ...