【BZOJ1453】[Wc]Dface双面棋盘

Description

Input

Output

Sample Input

Sample Output

HINT

题解:话说看到题的第一反应其实是LCT。。。还是学学正解的写法吧(虽然复杂度不如LCT)。

我们用线段树维护所有的行,每个叶子节点都代表一个列,每个线段树的节点都维护如下信息:左面那列的连通情况(用并查集维护),右面那列的连通情况,左面那列的颜色,右面那列的颜色。合并的时候枚举中间的那列,如果相邻颜色相同则进行并查集合并。特别地,如果在合并后,一些点在并查集中的根是中间的点,那么我们要将这些点的根变为两边的点,细节什么的仔细想一想就好。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
int n,m;
int v[210][210];
struct sag
{
int f[810],c[410],s[2];
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
friend sag operator + (const sag &a,const sag &b)
{
sag c;
int i;
c.s[0]=a.s[0]+b.s[0],c.s[1]=a.s[1]+b.s[1];
for(i=1;i<=n;i++)
{
c.c[i]=a.c[i],c.c[i+n]=b.c[i+n],c.f[i]=a.f[i],c.f[i+n]=b.f[i+n],c.f[i+2*n]=a.f[i+n],c.f[i+3*n]=b.f[i];
if(c.f[i]>n) c.f[i]+=n;
if(c.f[i+n]<=n) c.f[i+n]+=3*n;
if(c.f[i+2*n]>n) c.f[i+2*n]+=n;
if(c.f[i+3*n]<=n) c.f[i+3*n]+=3*n;
}
for(i=1;i<=n;i++) if(a.c[i+n]==b.c[i]&&c.find(i+2*n)!=c.find(i+3*n))
c.s[a.c[i+n]]--,c.f[c.f[i+2*n]]=c.f[i+3*n];
//for(i=1;i<=(n<<2);i++) c.find(i),c.find(i+2*n);
for(i=1;i<=(n<<1);i++) if(c.find(i)>2*n) c.f[c.f[i]]=i,c.f[i]=i;
for(i=1;i<=(n<<1);i++) c.find(i);
return c;
}
}s[810];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
void build(int l,int r,int x)
{
if(l==r)
{
for(int i=1;i<=n;i++)
{
s[x].c[i]=s[x].c[i+n]=v[l][i];
if(i!=1&&v[l][i]==v[l][i-1]) s[x].f[i]=s[x].f[i+n]=s[x].f[i-1];
else s[x].f[i]=s[x].f[i+n]=i,s[x].s[v[l][i]]++;
}
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson),build(mid+1,r,rson);
s[x]=s[lson]+s[rson];
}
void updata(int l,int r,int x,int a,int b)
{
if(l==r)
{
s[x].c[b]^=1,s[x].c[b+n]^=1,s[x].s[0]=s[x].s[1]=0;
for(int i=1;i<=n;i++)
{
if(i!=1&&s[x].c[i]==s[x].c[i-1]) s[x].f[i]=s[x].f[i+n]=s[x].f[i-1];
else s[x].f[i]=s[x].f[i+n]=i,s[x].s[s[x].c[i]]++;
}
return ;
}
int mid=(l+r)>>1;
if(a<=mid) updata(l,mid,lson,a,b);
else updata(mid+1,r,rson,a,b);
s[x]=s[lson]+s[rson];
}
int main()
{
n=rd();
int i,j,a,b;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) v[i][j]=rd();
build(1,n,1);
m=rd();
for(i=1;i<=m;i++)
{
a=rd(),b=rd();
updata(1,n,1,a,b);
printf("%d %d\n",s[1].s[1],s[1].s[0]);
}
return 0;
}//5 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 2 3 2 2 3

【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集的更多相关文章

  1. BZOJ1453: [Wc]Dface双面棋盘

    Description Input Output Sample Input Sample Output HINT 线段树套并查集应该是比较好写的做法,时间复杂度为O(N^3+M*NlogN). #in ...

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

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

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

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

  4. 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)

    2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...

  5. BZOJ1453:[WC]Dface双面棋盘

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...

  6. [Wc]Dface双面棋盘()

    题解: 一道维护奇怪信息的线段树... 我刚开始看了标签想的是删去图上一个点后求连通性 发现不会 于是退化成一般图支持删除 插入 维护连通性 发现有2两种做法 1.lct维护 按照结束顺序先后排序,给 ...

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

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

  8. codeforces 811E Vladik and Entertaining Flags(线段树+并查集)

    codeforces 811E Vladik and Entertaining Flags 题面 \(n*m(1<=n<=10, 1<=m<=1e5)\)的棋盘,每个格子有一个 ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. 数据导入报错 Got a packet bigger than‘max_allowed_packet’bytes

    数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题 2个解决方法: 1.临时修改:mysql>set global max_a ...

  2. Specified VM install not found: type Standard VM, name jdk1.7

    网上抄袭来抄袭去,都说是将“workspace /.metadata/.plugins/org.eclipse.debug.core/.launches/”下的文件都删除掉. 的确,删除了解决问题了, ...

  3. 关于Unity中UI中的RawImage节点以及制作地图滚动效果

    一.贴图的Texture Type属性类型 Texture:会把贴图的大小转换为最相近的2的n次方,比如400X1369会转换为512X1024. Sprite 2D:是贴图的原始大小. 二.RawI ...

  4. 【转】【WPF】IvalueConverter和TypeConverter

    简要说明: IValueConverter主要用于XAML绑定和数据源之间的转换 TypeConverter主要用于自定义类的属性类型之间的转换 本文主要讲解如何使用IValueConverter和T ...

  5. ti的硬件时钟和系统时钟同步

    1.hwclock -w软到硬 hwclock -s 硬到软 2. 通过ntp网络时钟控制同步 3.etc下的localtime文件和GMT-8

  6. 转载:Erlang 函数(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/26/2737644.html Functions 1  Pattern matching 模式匹 ...

  7. AOP技术应用和研究--AOP简单应用

    为了更好的理解AOP实践和体现AOP的优势.我们始终将OOP和AOP的比較贯穿到下文中.并在终于总结出AOP与OOP相比所拥有的长处,AOP的缺点以及AOP一般的使用场景. 1.1 问题空间到解空间的 ...

  8. C++ string(转)

    C++中string是标准库中一种容器,相当于保存元素类型为char的vector容器(自己理解),这个类提供了相当丰富的函数来完成对字符串操作,以及与C风格字符串之间转换,下面是对string一些总 ...

  9. LR中点鼠标做关联(winsock协议)

    转自:http://blog.csdn.net/zeeslo/article/details/1661791 今天写一下winsock的关联操作. 以前看过一个文档.在英文版的讲winsock的,其中 ...

  10. [转]ASP.NET MVC 5 - 给数据模型添加校验器

    在本节中将会给Movie模型添加验证逻辑.并且确保这些验证规则在用户创建或编辑电影时被执行. 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY  ...