这是一道好题,按行建线段树,每个点维护上下边界的连通性,详细见代码注释

网上写法不一,自认为比较简单,就放出来相出来献丑吧

 var u,d:array[..,..] of longint;  //u[]上边界,d[]下边界
s,fa,q:array[..] of longint;
c:array[..,..] of longint; //维护对应颜色块数
a:array[..,..] of longint;
j,i,n,m,x,y:longint; function getf(x:longint):longint;
begin
if fa[x]<>x then fa[x]:=getf(fa[x]);
exit(fa[x]);
end; procedure union(i,m:longint);
var j,k1,k2,t:longint;
begin
c[i,]:=c[i*,]+c[i*+,];
c[i,]:=c[i*,]+c[i*+,];
for j:= to n do
begin
fa[j]:=u[i*,j];
fa[j+n]:=d[i*,j];
fa[j+*n]:=u[i*+,j]+*n; //防止编号重复
fa[j+*n]:=d[i*+,j]+*n;
end;
for j:= to n do
if a[m+,j]=a[m,j] then //子区间相邻连通块合并
begin
k1:=getf(fa[j+n]);
k2:=getf(fa[j+*n]);
if k1<>k2 then
begin
fa[k2]:=k1;
dec(c[i,a[m,j]]);
end;
end;
t:=;
for j:= to n do
begin
k1:=getf(fa[j]); //对整个区间上边界连通性重新标号
if s[k1]= then
begin
inc(t);
q[t]:=k1;
s[k1]:=j;
end;
u[i,j]:=s[k1];
k2:=getf(fa[j+*n]); //对整个区间下边界连通性重新标号
if s[k2]= then
begin
inc(t);
q[t]:=k2;
s[k2]:=j+n; //防止编号重复,上边界编号1~n,下边界编号n+~2n
end;
d[i,j]:=s[k2];
end;
for j:= to t do
s[q[j]]:=;
end; procedure leaf(i,row:longint);
var j,t:longint;
begin
t:=;
c[i,]:=; c[i,]:=;
for j:= to n do
if (j<>) and (a[row,j]=a[row,j-]) then
begin
u[i,j]:=u[i,j-];
d[i,j]:=d[i,j-];
end
else begin
inc(c[i,a[row,j]]);
u[i,j]:=j; d[i,j]:=j; //连通块以起始位置为编号,这样比较方便
end;
end; procedure build(i,l,r:longint);
var m:longint;
begin
if l=r then leaf(i,l)
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
union(i,m);
end;
end; procedure work(i,l,r:longint);
var m:longint;
begin
if l=r then leaf(i,l)
else begin
m:=(l+r) shr ;
if x<=m then work(i*,l,m)
else work(i*+,m+,r);
union(i,m);
end;
end; begin
readln(n);
for i:= to n do
for j:= to n do
read(a[i,j]);
build(,,n);
readln(m);
for i:= to m do
begin
readln(x,y);
a[x,y]:=-a[x,y];
work(,,n);
writeln(c[,],' ',c[,]);
end;
end.

bzoj1453的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [BZOJ1453]Dface双面棋盘

    Description Input Output Sample Input Sample Output HINT 线段树+并查集,暴力记录和更新一些信息,详情见代码注解. #include<cm ...

  7. 【待填坑】bzoj上WC的题解

    之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 ...

随机推荐

  1. ACE_linux:任务 & 命令(Task and Command)

    1.涉及类 ACE_Task//ACE任务ACE_Activation_Queue//ACE命令队列 ACE_Method_Request//ACE请求(命令) 2.简介 ACE主动对象模式 主动对象 ...

  2. php中类的声明与使用

    <?php /**php语言是支持面向对象编程的,对于面向对象的编程,学过java和C++的人都知道啊! *如果不清楚的去baidu问一下就可以了. */ //我们来定义一个类,定义类的关键字是 ...

  3. (转载)直接用SQL语句把DBF导入SQLServer

    告诉大家一个直接用SQL语句把DBF导入SQLServer,以及txt导入Access的方法,大家抛弃BatchMove吧来自:碧血剑告诉你一个最快的方法,用SQLServer连接DBF在SQLSer ...

  4. .NET基础之迭代器

    使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢? 调用arrayLis.GetEnumber ...

  5. PCB优化设计(转载)

    PCB优化设计(一) 2011-04-25 11:55:36|  分类: PCB设计   目 前SMT技术已经非常成熟,并在电子产品上广泛应用,因此,电子产品设计师有必要了解SMT技术的常识和可制造性 ...

  6. splObjectStroge的作用,实例化一个数组

    PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...

  7. mysql常用数据类型的选择

    时间戳可以用int来存储 ip地址的存储数据类型,可以使用INET_ATON 和INET_NTOA来配合bigint类型来代替varchar

  8. JS 实现取整

    Js 常用数值函数(Math,parseInt)取整   1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1Math.ceil(5/2) 3,四舍五入.Mat ...

  9. UI开发核心问题-UI随屏幕自适应

    屏幕分辨率对UI适配的影响 一般来说,UIRoot都会选择FixSize的缩放模式,这样可以让UI随着分辨率而自动缩放,保持和屏幕相对的大小比例不变,让UI整体看上去不会有变大变小的奇怪现象.但是,还 ...

  10. c++ deque 双端队列

    双端队列: 函数 描述 c.assign(beg,end)c.assign(n,elem)  将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c. c.at(idx)  传回索引 ...