[WC2005]双面棋盘】的更多相关文章

题目 P4121 [WC2005]双面棋盘 貌似是刘汝佳出的题目?? 做法 线段树维护并查集 线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中间这两层有关,\((n≤200)\)并查集暴力做一下就好了 My complete code #include<cstdio> #include<cstring> #include<iostream> #include<string> #include<a…
description 洛谷 给出一个\(n\times n\)的黑白棋盘. \(m\)次操作,每次将一个格子进行颜色翻转,求每次操作后的黑白四连通块数. data range \[n\le 200,m\le 10000\] solution 解决动态维护图连通性的方法有2种: 一种是通过\(LCT\)动态维护最大删边时间生成树,另一种是线段树分治. 所以当然线段树分治更好写不是吗反正不会LCT的做法. 然后稍稍讨论一波就完了 Code #include<bits/stdc++.h> #inc…
原题传送门 这道题肥肠毒瘤qwqwq,我被卡了qwqwq 这题的正解好像是线段树+并查集,但由于我人丑常数大被卡成了70 #include <bits/stdc++.h> #define N 205 #define getchar nc using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,10…
题目描述 题解 唉,还是码力不行,写了一个多小时发现想错了又重构了一个多小时. 这道题意图很显然,动态维护联通块,有一个经典做法就是用LCT维护按照删除时间维护的最大生成树. 网上还有一种神奇的做法,线段树套并查集,蒟蒻表示不懂.. 这道题可以利用并查集操作可以撤销这种性质来做. 线段树分治 线段树分治可以分两种情况,操作之间独立和操作之间不独立. 操作之间独立意味着我先完成哪个操作就可以,例如找最优点,有一道例题. 还有一种是操作之间是可以相互影响的,比如说这道题,连通性这种东西和我加的每一条…
线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Code\ Below:\) #include <bits/stdc++.h> #define lson (rt<<1) #define rson (rt<<1|1) using namespace std; const int maxn=200+10; int n,m,a[m…
传送门 先膜一下大佬->这里 据说这题正解是LCT,然而感觉还是线段树套并查集的更容易理解 我们对于行与行之间用线段树维护,每一行内用并查集暴力枚举 每一行内用并查集暴力枚举连通块这个应该容易理解,就是如果是同一个同色连通块的就用并查集连起来.那么怎么处理行与行之间的连通块嘞? 因为几行连起来可以看做一块,那么我们用$[1,n]$维护最上面一行的连通性,用$[n+1,n*2]$维护最下面一行的连通性,然后用$[n*2+1,n*4]$作为辅助 这一部分的细节还是看代码好了,写在注解里了 //min…
[BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT...还是学学正解的写法吧(虽然复杂度不如LCT). 我们用线段树维护所有的行,每个叶子节点都代表一个列,每个线段树的节点都维护如下信息:左面那列的连通情况(用并查集维护),右面那列的连通情况,左面那列的颜色,右面那列的颜色.合并的时候枚举中间的那列,如果相邻颜色相同则进行并查集合并.特别地,如果在…
1453: [Wc]Dface双面棋盘 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 617  Solved: 317[Submit][Status][Discuss] Description Input Output Sample Input Sample Output HINT       用线段树+数组模拟并查集,维护每一列的连通性,然后暴力合并就行了,常数巨大 #include<cstdio> #include<cstring>…
离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using namespace std; const int dx[]={-1,1,0,0}; const int dy[]={0,0,-1,1}; const int inf=1e9; int n; int cal1(int x1,int y1,int x2,int y2){ int i=(min(x1,x2)*n+m…
点此看题面 大致题意: 给你一个\(n*n\)的黑白棋盘,每次将一个格子翻转,分别求黑色连通块和白色连通块的个数. \(LCT\)动态维护图连通性 关于这一部分内容,可以参考这道例题:[BZOJ4025]二分图. 大致思路 我们可以将同种颜色的相邻格子之间连边,这样就可以把问题搬到图上. 然后考虑先离线,把每两个格子间边的加入与删除的时间(同一条边可能被加入和删除多次)记录下来. 这样就可以用\(LCT\)动态维护图连通性了. 但注意这道题比较恶心,需要你每次求出两种颜色的连通块个数. 我一开始…