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 分数规划+树分治+单调队列 ...
随机推荐
- linux安装Vmware的时候出现“Could not open /dev/vmmon”
在centos6.6上安装了Vmware之后运行出现下列问题 VMware Workstation : Could not open /dev/vmmon: No such file or direc ...
- UVA 725
Description Write a program that finds and displays all pairs of 5-digit numbers that between them ...
- insert into (select...WITH CHECK OPTION) values(...)
insert into (<subquery> WITH CHECK OPTION) values (...) 语法看起来很特殊,其实是insert进subquery的这张表里: 1. 只 ...
- MySQL的复制原理及配置
MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题. 一.复制的原理 MySQL 复制基于主服 ...
- android锁屏和finish()后activity生命周期的变化
之前写了一个一键锁屏软件,有个朋友用了后发现了问题,所以昨天研究了一个activity在锁屏后的生命周期变化.如下: 锁屏分为两个步骤,先是锁定屏幕,再是黑屏 onCreate(在该方法里锁屏)--- ...
- webstorm 11 安装配置 grunt 时遇到的问题及解决办法
想学grunt的可以看看这篇文章,写的很有意思,教程之类的我就不写了,网上很多资料,我就记录下我遇到的问题和解决办法. http://yujiangshui.com/grunt-basic-tutor ...
- 【扩展欧几里得】Codevs 1200: [noip2012]同余方程
Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. Outpu ...
- hdu 4192
dfs全排列 加 模拟计算 #include <iostream> #include <cstdio> #include <cstdlib> #include ...
- uva 108
降维 枚举行累加 然后求单行上最大连续和 #include <iostream> #include <cstring> #include <cstdio> # ...
- <Learning How to Learn>Week One: Focused versus Diffuse Thinking
1-1 Introduction to the focused and diffuse modes (4:40) 两种思考的模式:focused mode以及diffuse mode focused ...