bzoj1453
这是一道好题,按行建线段树,每个点维护上下边界的连通性,详细见代码注释
网上写法不一,自认为比较简单,就放出来相出来献丑吧
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的更多相关文章
- 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集
[BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...
- BZOJ1453: [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树套并查集应该是比较好写的做法,时间复杂度为O(N^3+M*NlogN). #in ...
- 【BZOJ1453】[WC] Dface双面棋盘(LCT维护联通块个数)
点此看题面 大致题意: 给你一个\(n*n\)的黑白棋盘,每次将一个格子翻转,分别求黑色连通块和白色连通块的个数. \(LCT\)动态维护图连通性 关于这一部分内容,可以参考这道例题:[BZOJ402 ...
- BZOJ1453:[WC]Dface双面棋盘
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...
- BZOJ1453: [WC2005]Dface双面棋盘
离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using ...
- [BZOJ1453]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树+并查集,暴力记录和更新一些信息,详情见代码注解. #include<cm ...
- 【待填坑】bzoj上WC的题解
之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 ...
随机推荐
- CodeIgniter 框架---学习笔记
1.输出sql语句:echo $this->db->last_query();
- PHP的$_SERVER['HTTP_HOST']获取服务器地址功能详解,$_SERVER['HTTP_X_FORWARDED_HOST']
uchome的index文件中的二级域名功能判断,使用了php的$_SERVER['HTTP_HOST'],开始对这个不是很了解,所以百度了一下,发现一篇帖子有点意思,转发过来做个记录. 在php中, ...
- 字符串转换成整型数 atoi()
题目说明: 1.设计函数: int atoi(const char *nptr); 2.功能:把字符串转换成整型数,atoi()会扫描参数nptr字符串,如果第一个非空格字符存在, 是数字或者正负号则 ...
- ubuntu下安装ffmpeg和X264
第一步:安装必要的库 $:-dev libtheora-dev libx11-dev zlib1g-dev 第二步:安装SDL(否则可能编译不出ffplay) $:-dev $:-dev libsdl ...
- 阿里云服务器无法远程其他的mysql服务器
1.初始化root密码 进入mysql数据库 1 mysql>update user set password=PASSWORD('123456') where User='root'; 2.允 ...
- EXTJS API
EXTJS API 链接: http://docs.sencha.com/extjs/5.0.0/ http://docs.sencha.com/extjs/4.2.2/ http://docs.se ...
- 黑马程序员 SaveFileDialog的跨线程调用 (专题三)
<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a> ...
- 然爸读书笔记(2013-4)----打造facebook
扎克伯格的真实一面 (1)在公司内部知无不言,扎克伯格在公司内部问答时间.尽可能回答员工的任何问题,保持足够的透明度. (2)员工只有做到对外守口如瓶,我们才能做到对内知无不言. (3)faceboo ...
- encodeURIComponent()编码和decodeURIComponent()解码
html1: <!DOCTYPE HTML> <meta charset=utf-8> <meta http-equiv="X-UA-Compatible&qu ...
- centos最小安装 setuptools安装
centos运行不了setup?那安装setuptool吧,可以节省很多系统管理的时间. #安装setuptoolyum install setuptool#可以发现执行setup后不全,再安装一个用 ...