题目

P4121 [WC2005]双面棋盘

貌似是刘汝佳出的题目??

做法

线段树维护并查集

线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑、白各自的联通块数量

考虑区间合并,其实就与中间这两层有关,\((n≤200)\)并查集暴力做一下就好了

My complete code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef int LL;
const LL maxn=500;
inline LL Read(){
LL x(0),f(1);char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
LL n,nod,root,m;
LL a[210][210],fa[maxn<<1],belong[maxn<<1];
struct Tree{
LL f[maxn],son[2],sum[2];
}T[maxn<<1];
LL Get_fa(LL x){
return fa[x]=(fa[x]==x?x:Get_fa(fa[x]));
}
inline void First(LL now,LL x){
T[now].sum[a[x][1]]=1,
T[now].sum[a[x][1]^1]=0;
T[now].f[1]=T[now].f[1+n]=1;
LL pre=1;
for(LL i=2;i<=n;++i){
if(a[x][i]!=a[x][pre])
++T[now].sum[a[x][pre=i]];
T[now].f[i]=T[now].f[i+n]=pre;
}
}
inline void Update(LL now,LL mid,LL lc,LL rc){
for(LL i=0;i<2;++i)
T[now].sum[i]=T[lc].sum[i]+T[rc].sum[i];
for(LL i=1;i<=2*n;++i){
fa[i]=T[lc].f[i],
fa[i+2*n]=T[rc].f[i]+2*n;
}
for(LL i=1;i<=n;++i){
LL fx(Get_fa(i+n)),fy(Get_fa(i+2*n));
if(a[mid][i]==a[mid+1][i]&&fx!=fy){
--T[now].sum[a[mid][i]];
fa[fx]=fy;
}
}
for(LL i=1;i<=n;++i){
fa[i]=Get_fa(i);
belong[fa[i]]=i;
}
for(LL i=n+1;i<=2*n;++i){
fa[i+2*n]=Get_fa(i+2*n);
belong[fa[i+2*n]]=i;
}
for(LL i=1;i<=n;++i){
T[now].f[i]=belong[fa[i]];
T[now].f[i+n]=belong[fa[i+3*n]];
}
}
void Build(LL &now,LL l,LL r){
now=++nod;
if(l==r){
First(now,l);
return ;
}
LL mid(l+r>>1);
Build(T[now].son[0],l,mid),Build(T[now].son[1],mid+1,r);
Update(now,mid,T[now].son[0],T[now].son[1]);
}
void Change(LL now,LL l,LL r,LL c){
if(l==r){
First(now,l);
return;
}
LL mid(l+r>>1);
if(c<=mid)
Change(T[now].son[0],l,mid,c);
else
Change(T[now].son[1],mid+1,r,c);
Update(now,mid,T[now].son[0],T[now].son[1]);
}
int main(){
n=Read();
for(LL i=1;i<=n;++i)
for(LL j=1;j<=n;++j)
a[i][j]=Read();
Build(root,1,n);
m=Read();
while(m--){
LL x(Read()),y(Read());
a[x][y]^=1;
Change(root,1,n,x);
printf("%d %d\n",T[root].sum[1],T[root].sum[0]);
}
return 0;
}

P4121 [WC2005]双面棋盘的更多相关文章

  1. 【题解】Luogu P4121 [WC2005]双面棋盘

    原题传送门 这道题肥肠毒瘤qwqwq,我被卡了qwqwq 这题的正解好像是线段树+并查集,但由于我人丑常数大被卡成了70 #include <bits/stdc++.h> #define ...

  2. 洛谷P4121 [WC2005]双面棋盘(线段树套并查集)

    传送门 先膜一下大佬->这里 据说这题正解是LCT,然而感觉还是线段树套并查集的更容易理解 我们对于行与行之间用线段树维护,每一行内用并查集暴力枚举 每一行内用并查集暴力枚举连通块这个应该容易理 ...

  3. [WC2005]双面棋盘

    description 洛谷 给出一个\(n\times n\)的黑白棋盘. \(m\)次操作,每次将一个格子进行颜色翻转,求每次操作后的黑白四连通块数. data range \[n\le 200, ...

  4. [WC2005]双面棋盘(并查集+分治)

    题目描述 题解 唉,还是码力不行,写了一个多小时发现想错了又重构了一个多小时. 这道题意图很显然,动态维护联通块,有一个经典做法就是用LCT维护按照删除时间维护的最大生成树. 网上还有一种神奇的做法, ...

  5. [WC2005]双面棋盘(线段树+并查集)

    线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...

  6. 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集

    [BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...

  7. bzoj 1453: [Wc]Dface双面棋盘

    1453: [Wc]Dface双面棋盘 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 617  Solved: 317[Submit][Status][ ...

  8. BZOJ1453: [WC2005]Dface双面棋盘

    离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using ...

  9. 【BZOJ1453】[WC] Dface双面棋盘(LCT维护联通块个数)

    点此看题面 大致题意: 给你一个\(n*n\)的黑白棋盘,每次将一个格子翻转,分别求黑色连通块和白色连通块的个数. \(LCT\)动态维护图连通性 关于这一部分内容,可以参考这道例题:[BZOJ402 ...

随机推荐

  1. Java基础04 封装与接口(转载)

    数据成员和方法都是同时开放给内部和外部的.在对象内部,我们利用this来调用对象的数据成员和方法.在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对 ...

  2. CSS学习(二)- 有关 hasLayout 和 BFC

    1. hasLayout 概念说明 ‘Layout’ 可以被某些 CSS property(特性)不可逆的触发,而某些 HTML 元素本身就具有 layout . ‘Layout’ 在 IE 中可以通 ...

  3. Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?

    先上代码再进行分析 public class Test { public static void main(String[] args) { try{ int i = 100 / 0; System. ...

  4. lucene中的IndexWriter.setMaxFieldLength()

    lucene中的IndexWriter.setMaxFieldLength() 老版本的Lucene中,IndexWriter的maxFieldLength是指一个索引中的最大的Field个数. 这个 ...

  5. PHPStorm2017去掉参数提示 parameter name hints

    JetBrains 的各种语言的 IDE 都灰常灰常好用, 个个都是神器, PHPStorm 作为PHP开发的神器也不必多说了 今天升级到 PHPStorm 2017.1 发现增加了好些新功能, 有个 ...

  6. CodeIgniter框架——访问方式 URI 分配变量 数据库操作

    1.访问方式: CodeIgniter 的访问URL使用的是pathinfo,入口文件/控制器/方法(/参数列表) eg:localhost/index.php/welcome/index/id 第一 ...

  7. vue之v-bind:style

    <div class="collect" @click="collected=!collected"> <i class="fa f ...

  8. 《从零开始学Swift》学习笔记(Day 36)——静态方法

    原创文章,欢迎转载.转载请注明:关东升的博客 静态方法与静态属性类似,Swift中定义了静态方法,也称为类型方法.静态方法的定义与静态属性类似,枚举和结构体的静态方法使用的关键字是static:类静态 ...

  9. 【转】NPOI读写Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  10. php学习笔记8--半边引号引发的问题

    前段时间重装了系统,后来说是又要用php,就重新搭建了apache+php+mysql的环境,由于之前搭建过好多次,感觉很easy,很快就搭建完成,然后写了下面的常用的测试环境的代码: <?ph ...