[WC2005]双面棋盘(线段树+并查集)
线段树+并查集维护连通性。
好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行。
对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并。
\(Code\ Below:\)
#include <bits/stdc++.h>
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
const int maxn=200+10;
int n,m,a[maxn][maxn],f[maxn<<2],tmp[maxn<<2],wsum[maxn<<2],bsum[maxn<<2],lfa[maxn<<2][maxn],rfa[maxn<<2][maxn];
inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
int find(int x,int *f){
return (x==f[x])?x:f[x]=find(f[x],f);
}
inline void pushup(int rt,int mid){
wsum[rt]=wsum[lson]+wsum[rson];
bsum[rt]=bsum[lson]+bsum[rson];
for(int i=1;i<=n;i++){
f[i]=lfa[lson][i];f[i+n]=rfa[lson][i];
f[i+2*n]=lfa[rson][i]+2*n;f[i+3*n]=rfa[rson][i]+2*n;
}
for(int i=1;i<=n;i++)
if(a[mid][i]==a[mid+1][i]){
if(find(i+n,f)!=find(i+2*n,f)){
f[find(i+n,f)]=f[find(i+2*n,f)];
if(a[mid][i]==0) wsum[rt]--;
else bsum[rt]--;
}
}
for(int i=1;i<=n;i++) tmp[find(i,f)]=i;
for(int i=3*n+1;i<=4*n;i++) tmp[find(i,f)]=i-2*n;
for(int i=1;i<=n;i++){
lfa[rt][i]=tmp[find(i,f)];
rfa[rt][i]=tmp[find(i+3*n,f)];
}
}
void build(int l,int r,int rt){
if(l == r){
for(int i=1;i<=n;i++) lfa[rt][i]=i;
for(int i=1;i<=n;i++){
if(a[l][i]==0) wsum[rt]++;
else bsum[rt]++;
if(a[l][i-1]==a[l][i]){
lfa[rt][find(i-1,lfa[rt])]=i;
if(a[l][i]==0) wsum[rt]--;
else bsum[rt]--;
}
rfa[rt][i]=lfa[rt][i];
}
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
pushup(rt,mid);
}
void modify(int x,int l,int r,int rt){
if(l == r){
wsum[rt]=bsum[rt]=0;
for(int i=1;i<=n;i++) lfa[rt][i]=i;
for(int i=1;i<=n;i++){
if(a[l][i]==0) wsum[rt]++;
else bsum[rt]++;
if(a[l][i-1]==a[l][i]){
lfa[rt][find(i-1,lfa[rt])]=i;
if(a[l][i]==0) wsum[rt]--;
else bsum[rt]--;
}
rfa[rt][i]=lfa[rt][i];
}
return ;
}
int mid=(l+r)>>1;
if(x <= mid) modify(x,l,mid,lson);
else modify(x,mid+1,r,rson);
pushup(rt,mid);
}
int main()
{
n=read();
for(int i=1;i<=n;i++) a[i][0]=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) a[i][j]=read();
build(1,n,1);
m=read();
int x,y;
while(m--){
x=read(),y=read();
a[x][y]^=1;modify(x,1,n,1);
printf("%d %d\n",bsum[1],wsum[1]);
}
return 0;
}
[WC2005]双面棋盘(线段树+并查集)的更多相关文章
- 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集
[BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- codeforces 811E Vladik and Entertaining Flags(线段树+并查集)
codeforces 811E Vladik and Entertaining Flags 题面 \(n*m(1<=n<=10, 1<=m<=1e5)\)的棋盘,每个格子有一个 ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【XSY2707】snow 线段树 并查集
题目描述 有\(n\)个人和一条长度为\(t\)的线段,每个人还有一个工作范围(是一个区间).最开始整条线段都是白的.定义每个人的工作长度是这个人的工作范围中白色部分的长度(会随着线段改变而改变).每 ...
- bzoj 2054: 疯狂的馒头(线段树||并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...
- 【CF687D】Dividing Kingdom II 线段树+并查集
[CF687D]Dividing Kingdom II 题意:给你一张n个点m条边的无向图,边有边权$w_i$.有q个询问,每次给出l r,问你:如果只保留编号在[l,r]中的边,你需要将所有点分成两 ...
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
Vladik and Entertaining Flags Time Limit: 20 Sec Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...
- 【BZOJ 4662】 4662: Snow (线段树+并查集)
4662: Snow Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 136 Solved: 47 Description 2333年的某一天,临冬突 ...
随机推荐
- java:static详解
1.static修饰的变量习惯称为静态变量,static修饰的方法称为静态方法,static修饰的代码块叫做静态代码块. 1)static变量 static变量也称作静态变量,静态变量和非静态变量的区 ...
- mysql之多表查询和pymysql模块
一 多表查找方法 1 交叉连接:不使用任何的判断条件,生成笛卡尔积.第一个表的行数乘以第二个表的行数就等于笛卡尔积结果集的行数. mysql> select * from student,cla ...
- PHP中奖概率实现
$prize_arr = array( '0' => array('id'=>1,'prize'=>'elm_1','rate'=>1), '1' => array('i ...
- php 操作redis 以及几个常用命令
redis-cli -h host -p port -a password 首次进入redis 进行绑定ip和端口号 del key 删除指定key exists key 检查指定key是否存 ...
- mybatis LIKE
<sql id="selectId"> `ID` AS id, `NAME` AS name, `DESCRIPTION` AS description, `TYPE` ...
- acitvemq的jvm监控
在conf/activemq.xml启用jmx监控 即在broker后面添加useJmx="true"配置参数 <managementContext> <mana ...
- IntelliJ IDEA 2017版 spring-boot 拦截器的操作三种方式
一.注解方式 @WebServlet(urlPatterns = "/myServlet") public class MyServlet extends HttpServlet ...
- MFCC
在语音识别研究领域,音频特征的选择至关重要.在这里介绍一种非常成功的音频特征——Mel Frequency Cepstrum Coefficient(MFCC),中文名字为梅尔频率倒谱系数.MFCC特 ...
- WordPaster-dedecms5.7整合教程
1.1. 与dedecms5.7整合 本教程中提到的插件文件可在官网的php-ckeditor3x示例中找到. 示例:http://www.ncmem.com/download/WordPaster2 ...
- crontab和crond分析
目录 目录 1 1. 研究目的 1 2. 基本概念 1 3. crontab 1 3.1. 编辑 2 3.1.1. "crontab -e"工作流 2 3.2. 问题 3 4. c ...