线段树专题-黑白棋盘 BZOJ-1453

线段树专题-黑白棋盘

题目来源

BZOJ−1453BZOJ-1453BZOJ1453

题意

  • QQQ次操作
  • 每次操作给出(x,y)(x,y)(x,y),将(x,y)(x,y)(x,y)个格子颜色取反
  • 每次操作后,输出棋盘上黑白联通块的个数
  • n≤100,Q≤104n \le 100,Q \le 10^4n100,Q104

题解

显然不能直接套并查集,因为直接套并查集的时间复杂度为O(n2Q)=108O(n^2Q) = 10^8O(n2Q)=108

考虑使用线段树维护并查集.

线段树维护的是[l,r][l,r][l,r]行中黑白联通块的数量,其中重点维护l,rl,rl,r两行的并查集.

遇到合并操作的时候,如把[l1,r1][l_1,r_1][l1,r1][l2,r2][l_2,r_2][l2,r2]做合并.

首先将各自的黑白联通块数量合并到[l1,r2][l_1,r_2][l1,r2]中去,然后再从中减去并查集合并时候造成的联通块减小的部分数.

首先构建一颗大小为4n4n4n的并查集,把l1l_1l1并查集放于第一层,r1r1r1并查集放于第二层,把l2l_2l2并查集放于第三层,r2r2r2并查集放于第四层.注意此时第一层和第二层有关系,第三层和第四层有关系.然后枚举i:[1,n]i : [1,n]i:[1,n],打通第二层和第三层之间的关系,并更新黑白联通块的个数.

因为中间的二三层在做完以上操作的时候已经没有用了,因此我们要把它们删掉,并且将规模4n4n4n的并查集缩小至2n2n2n.

我们需要玩一个小trictrictric,即把第一层的并查集的根节点全都换成第一层里的数,把第四层并查集里的根节点全都换成第二层里的数.这样的话并查集又可以缩小为2n2n2n了.

小tric的代码

rep(i,1,n) {tmp[findset(pa,pa[i])] = i;tmp[findset(pa,pa[i+3*n])] = i+n;
}
rep(i,1,n) {ns[rt].pa[i] = tmp[findset(pa,pa[i])];ns[rt].pa[i+n] = tmp[findset(pa,pa[i+3*n])];
}

代码

#include <cstdio>
#include <iostream>#define rep(x,a,b) for(int x = a;x <= b;++x) 
#define pr(x) std::cout << #x << ":" << x << std::endl
const int N = 201;
int n,m;
int bit[N][N];
void initset(int pa[],int n) {rep(i,1,n) pa[i] = i;}
int findset(int pa[],int x) {return x == pa[x]?x:pa[x] = findset(pa,pa[x]);}
int join(int pa[],int x,int y) {int px = findset(pa,x),py = findset(pa,y);if(px != py) {pa[px] = py;return true;}return false;
}
struct Node{int pa[2*N];int color[2];void init(int line) {color[0] = color[1] = 0;initset(pa,n);rep(i,1,n-1) if(bit[line][i] == bit[line][i+1])join(pa,i+1,i);rep(i,1,n) pa[i+n] = pa[i];rep(i,1,n)if(findset(pa,i) == i) color[bit[line][i]] ++;}
}ns[N<<2];
int pa[N<<2],tmp[N<<2];
void maintain(int rt,int l,int r){int mid = (l + r) / 2;int lc = rt << 1,rc = rt << 1 | 1;rep(i,1,2*n) {pa[i] = ns[lc].pa[i];pa[i+2*n] = ns[rc].pa[i] + 2*n;}ns[rt].color[0] = ns[lc].color[0] + ns[rc].color[0];ns[rt].color[1] = ns[lc].color[1] + ns[rc].color[1];rep(i,1,n) {if(bit[mid][i] == bit[mid+1][i]) {if(join(pa,i+2*n,i+n)){ns[rt].color[bit[mid][i]] --;}}}rep(i,1,n) {tmp[findset(pa,pa[i])] = i;tmp[findset(pa,pa[i+3*n])] = i+n;}rep(i,1,n) {ns[rt].pa[i] = tmp[findset(pa,pa[i])];ns[rt].pa[i+n] = tmp[findset(pa,pa[i+3*n])];}
}
void build(int rt,int l,int r) {if(l == r) {ns[rt].init(l);return ;}int mid = (l + r) / 2;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);maintain(rt,l,r);
}
void change(int rt,int l,int r,int pos) {if(l == r) ns[rt].init(l);else {int mid = (l + r) / 2;if(pos <= mid) change(rt<<1,l,mid,pos);else change(rt<<1|1,mid+1,r,pos);maintain(rt,l,r);}
}
int main() {std::ios::sync_with_stdio(false);std::cin >> n;rep(i,1,n) rep(j,1,n) {std::cin >> bit[i][j];}build(1,1,n);//std::cout << ns[1].color[0] << " " << ns[1].color[1] << std::endl;std::cin >> m;while(m--) {int x,y;std::cin >> x >> y;bit[x][y] ^= 1;change(1,1,n,x);std::cout << ns[1].color[1] << " " << ns[1].color[0] << std::endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

约数个数

约数个数 题目大意&#xff1a; 求a到b之间每个数的约数的个数之和 原题&#xff1a; 题目描述 定义f(x)为x的约数个数&#xff0c;x为正整数。 f(a)f(a1)……f(b)&#xff0c;即a,b之间每个数的约数的总和。 输入 一行两个正整数a、b&#xff0c;以一个空格隔开。 输出…

P2257-YY的GCD【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P2257 题目大意 给出n,mn,mn,m&#xff0c;求∑i1n∑j1m[gcd(i,j)∈p]\sum_{i1}^n\sum_{j1}^m[gcd(i,j)\in p]i1∑n​j1∑m​[gcd(i,j)∈p] 定义ppp是质数集 解题思路 首先考虑定义f(x)∑i1n∑j1m[gcd(i,j)x]f(x)\sum_{i1}…

asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...

最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ &#xff01;因此学习了一下这个开源框架&#xff01;下面对Exceptionless的学习做下笔记&#xff01;Exceptionless是什么&#xff1f;能做什么呢&#xff1f;“Exceptionless”这…

【dfs】【树】机器选择

机器选择 题目大意&#xff1a; 有一个树状的图&#xff0c;要求安一个点&#xff0c;使这个点到最远的点的距离最小 原题&#xff1a; 题目描述 自从省队NOI赛前集训在scz举行之后&#xff0c;一个名叫cs1.6.exe的文件开始在机房广泛使用起来。每天大家都要找神犇小X借移…

ACM-ICPC中博弈论的一些小小总结

博弈论 参考 [1]https://blog.csdn.net/clover_hxy/article/details/53818624 [2]https://blog.csdn.net/foreyes_1001/article/details/82862324 [3]https://www.cnblogs.com/lxm940130740/p/3268803.html 一.尼姆博弈 问题提出 下面给出Nim游戏的三种变体 现有nnn堆石子,每…

P3312-[SDOI2014]数表【莫比乌斯反演,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P3312 题目大意 定义F(x)F(x)F(x)表示xxx的约数和 给出n,m,an,m,an,m,a&#xff0c;求∑i1n∑j1m[F(gcd(i,j))≤a]∗F(gcd(i,j))\sum_{i1}^n\sum_{j1}^m[F(gcd(i,j))\leq a]*F(gcd(i,j))i1∑n​j1∑m​[F(gcd(i,j))≤a]∗F(g…

使用 IIS 在 Windows 上托管 ASP.NET Core2.0

准备&#xff1a;操作系统&#xff1a;Windows Server 2008 R2 或更高版本开发环境&#xff1a;VS2017回到顶部第一步&#xff1a;新建项目ASP.NET Core Web应用程序在 Visual Studio 中&#xff0c;选择“文件”>“新建”>“项目”。在新建项目对话框的左侧窗格选择“.N…

数学推导题,NTT,快速数论变换,Wannafly-导数卷积

导数卷积 题目描述 题解 参考了一下标程的推导过程,因为这个推导对我这种数学弱渣真的有点难鸭. [1]f(x)f(x)f(x)的iii次导函数: f(i)(x)ai∗i!0!ai1∗(i1)!1!∗x1...an−1∗(n−1)!(n−1−i)!∗xn−1−if^{(i)}(x) a_{i}*\frac{i!}{0!} a_{i1}*\frac{(i1)!}{1!}*x^{1} ...…

初一级练习题(2019.3.8)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky250250250100100100100100100505050000222lyflyflyf240240240100100100505050505050404040333wjjwjjwjj210210210909090707070505050000555lthlthlth12012012020202050505050505…

使用 C# 代码实现拓扑排序

0.参考资料尊重他人的劳动成果&#xff0c;贴上参考的资料地址&#xff0c;本文仅作学习记录之用。https://www.codeproject.com/Articles/869059/Topological-sorting-in-Csharphttps://songlee24.github.io/2015/05/07/topological-sorting/https://www.cnblogs.com/skywang1…

P3327-[SDOI2015]约数个数和【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P3327 题目大意 TTT组询问给出n,mn,mn,m&#xff0c;d(x)d(x)d(x)表示xxx的约数个数&#xff0c;求∑i1n∑j1md(i∗j)\sum_{i1}^n\sum_{j1}^md(i*j)i1∑n​j1∑m​d(i∗j) 解题思路 对于iii和jjj的两个约数a,ba,ba,b如果他们…

数学推导题,NTT,快速数论变换,Wannafly-乒乓球

乒乓球 题目描述 小 BoBoBo 是某省乒乓球名列前茅的选手&#xff0c;现在他有 nnn 颗乒乓球一字排开&#xff0c;第iii颗乒乓球的权值为 wiw_iwi​ 每次他会随机从现有的乒乓球中等概率选一颗拿走&#xff0c;然后得到的收益是这颗球左边第一个乒乓球和右边第一个乒乓球的权值…

ASP.NET Core 2.1带来SignalR、Razor类库

随着.NET Core 2.1的发布&#xff0c;微软推出了 ASP.NET Core 2.1。这是一个强大的版本&#xff0c;包括实时通信库SignalR&#xff0c;更新的模板使GDPR更容易遵守&#xff0c;并且针对Angular、React&#xff0c;以及React Redux更新了SPA模板。在2013年发布传统的ASP.NET时…

【bfs】WJ的逃离

WJ&#xff08;J&#xff09;的逃离 题目大意&#xff1a; 有一个nm的矩阵&#xff0c;*是不可走的&#xff0c;0是可走的&#xff0c;求1,1到n,m的最小转弯次数 原题&#xff1a; 题目描述 当WJ醒来时&#xff0c;发现自己被困在一个地图的左上角&#xff0c;幸好WJ有张图…

P2408- 不同子串个数【SA】

正题 题目链接:https://www.luogu.com.cn/problem/P2408 题目大意 给出一个字符串&#xff0c;求有多少个不同的子串。 解题思路 进行后缀排序之后&#xff0c;对于位置iii他有n−i1n-i1n−i1个后缀&#xff0c;然后它和排在它前面的后缀有heightiheight_iheighti​个重复的…

针对ASP.NET Core Web API的先进架构

.NET Core 最初是在2016年发布的&#xff0c;随着.NET Core 2.0的发布&#xff0c;微软拥有了下一个通用、模块化、跨平台和开源的平台主版本。.NET Core已经创建了许多API&#xff0c;在当前版本的.net框架中均可用。它最初是为下一代ASP.NET解决方案而创建的&#xff0c;但现…

线段树-HDU5737-这题有点神

HDU5737 题意 [1][1][1]有长度为nnn的序列A,BA,BA,B [2]Q[2]Q[2]Q此操作两种类型 (1,l,r,x)(1,l,r,x)(1,l,r,x)将区间[l,r][l,r][l,r]的aia_iai​覆盖为xxx(2,l,r)(2,l,r)(2,l,r)询问区间[l,r][l,r][l,r]中有多少ai≥bia_i \ge b_iai​≥bi​ 题解 考虑用线段树维护. 重点考…

【高精】Oliver的成绩(jzoj 2008)

Oliver的成绩 题目大意&#xff1a; Oliver考了一次试&#xff0c;现在知道他的语数英的成绩&#xff0c;还有年级其他n个人的成绩&#xff0c;现在问Oliver三科各和年级第一差多少分&#xff0c;如果Oliver在这一科上是第一&#xff0c;则输出‘0’ 样例输入 10 10 10 …

P4070-[SDOI2016]生成魔咒【SA,平衡树】

正题 题目链接:https://www.luogu.com.cn/problem/P4070 题目大意 长度为nnn的字符串&#xff0c;对于每个iii求字符串1∼i1\sim i1∼i部分有多少个不同的子串。 解题思路 对于整个串ans∑i1nn−i1−heightians\sum_{i1}^nn-i1-height_ians∑i1n​n−i1−heighti​&#xff…

ASP.NET Core 2.1 使用Docker运行

1.新建一个 ASP.NET Core 2.1 项目然后运行一下项目&#xff0c;确保我们刚刚建立的项目可以正常运行。2.编写 Dockerfile新建一个文本文件&#xff0c;命名为 DockerfileFROM microsoft/dotnet:2.1-aspnetcore-runtimeWORKDIR /appCOPY . .EXPOSE 80ENTRYPOINT ["dotnet&…