题目

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. spark 1.3 发布了

    悄悄地,spark 还是像往常一样,发布了1.3版本,从release notes可以看出,这一版本比较大的变化是1. 增加了DataFrame API,这样以后操作一些结构化的数据集时将会变的非常方 ...

  2. 【转载】java连接MYSQL

    原文出自 http://qq163230530.blog.163.com/blog/static/4289250620081186262719/ 这篇文章主要以MySQL为例讲下Java如何连接到数据 ...

  3. android自定义View_3——Optimizing the View

    前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...

  4. CodeIgniter框架——源码分析之Config.php

    CI框架的配置信息被存储在$config数组中,我们可以添加自己的配置信息或配置文件到$config中: $this->config->load('filename'); //加载配置文件 ...

  5. hdu1174(3维射线与圆是否相交)

    简单的题意,要注意z2 = h2*0.9-r2 #include <iostream> #include <cmath> #include <vector> #in ...

  6. EasyNVR支持的摄像机、NVR设备接入类型以及关于国标设备是否支持接入EasyNVR无插件流媒体服务器

    背景分析: 随着互联直播的发展,EasyNVR也是顺应时代潮流顺势发展,也是越来越受广大客户的欢迎. 主要是因为EasyNVR可以完美的摆脱网络的限制,可以实现互联网级别的直播分发和录像回看,特别是对 ...

  7. 在Visual Studio 2015的Cordova项目中使用Gulp

    之前一直是在vs 2013中使用Cordova来开发移动app(目前有iPad版/iPhone版/安卓版),准备到下一个milestone的时候升级到2015,这两天在尝试各种东西. 2015中的co ...

  8. Velocity模版引擎使用总结

    Velocity是一个基于java的模板引擎.它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一 ...

  9. Directory和HashTable的区别

    1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读 ...

  10. jquery,日常 记录知识 点 (选择器的引用类型)

    1.标签引用$("p").$("input")例子 $("p").append( $("input").map(func ...