题目

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. SQL SERVER 2000安装教程图文详解

    注意:Windows XP不能装企业版.win2000\win2003服务器安装企业版一.硬件和操作系统要求 下表说明安装 Microsoft SQL Server 2000 或 SQL Server ...

  2. 第一百八十八节,jQuery,选项卡 UI

    jQueryUI,选项卡 UI 学习要点: 1.使用 tabs 2.修改 tabs 样式 3.tabs()方法的属性 4.tabs()方法的事件 5.tabs 中使用 on 选项卡(tab),是一种能 ...

  3. android Splashy Flash小游戏

    今年刚開始学习android,自己在寝室捎带学习了下做APP,因为是刚開始学习,这个游戏仅仅注重了游戏的实现,实现了大概功能后.也没有实现游戏的细节,像分数图片的显示等.也没有注意代码的结构.一个字就 ...

  4. 《TP5.0学习笔记---配置篇》

    参考博客:http://blog.csdn.net/self_realian/article/details/75045541

  5. Laravel 5.1 数组帮助函数(随发现更新)

    array_add 向一个数组中添加指定键值,如果键值不存在则添加,如果键本身就存在 那么就不添加: $test_array = ['name' => '大K', 'age' => 27] ...

  6. 16进制 ,Color,Colour转换

    import java.awt.Color; import jxl.format.Colour; public class ColorUtil { public static Colour getNe ...

  7. mysql-font的理解

    mysql-front是为mysql制作的一种图形化界面工具,可以管理和操作数据库,比如建表,修改数据,拖拽方式的数据库和表格,可编辑/可增加/删除的域,可编辑/可插入/删除的记录,可显示的成员,可执 ...

  8. W5100硬件设计和调试要点

    文章来源:成都浩然 与MCU的接口 W5100与MCU接口採用并行总线方式(假设要使用SPI接口,建议採用W5200),因此W5100与MCU的接口设计相对简单.以AT89C52为例,例如以下图所看到 ...

  9. app开发公司排名哪家强?看App Annie给出的答案

    app开发公司排名哪家强?这个答案不好定义,我们从第三方权威平台数据来看吧.App Annie在<全球移动应用市场2016年回顾>报告中从全球每月活跃用户数.全球下载量.全球收入等几个维度 ...

  10. 002 MIRO发票校验采购订单项目科目分配类别检查增强-20150819

    BADI SE19:ZINVOICE_UPDATE   MIRO发票检验过账好模拟时,检查采购订单line 是否有固定资产的行项目,如果有固定资产项目,则弹出提示框,提示消息:存在规定资产采购项目! ...