正题

这题主要是来练手的,因为没写过可撤销的并查集,大概就是把每一个格子看成一个点,然后格子直接的边有很多的出现区间,把这些出现区间和对应的颜色打到线段树上,然后用可撤销的并查集来维护就可以了.

#include<bits/stdc++.h>
#define ls now<<1
#define rs now<<1|1
using namespace std;#define pib pair<int,bool>
const int N=201;
int n,m,B,ans[2],tot[10010][2];
bool a[N][N];
int V[N*N*2],fa[N*N],sz[N*N];
pair<int,int> s[N*N*2];
vector<pair<int,bool> > P[40010];void add(int now,int x,int y,pib t,int l=1,int r=m){if(x==l && y==r){P[now].push_back(t);return ;}int mid=(l+r)/2;if(y<=mid) add(ls,x,y,t,l,mid);else if(mid<x) add(rs,x,y,t,mid+1,r);else add(ls,x,mid,t,l,mid),add(rs,mid+1,y,t,mid+1,r);
}int findpa(int x){if(fa[x]!=x) return findpa(fa[x]);return x;
}void insert(int x,bool op){int pa,pb,t1,t2;if(x<=B){t1=(x-1)/(n-1)+1,t2=(x-1)%(n-1)+1;pa=(t1-1)*n+t2;pb=(t1-1)*n+t2+1;}else{t2=(x-B-1)/(n-1)+1,t1=(x-B-1)%(n-1)+1;pa=(t1-1)*n+t2,pb=t1*n+t2;}int fx=findpa(pa),fy=findpa(pb);if(fx!=fy){if(sz[fx]<sz[fy]) swap(fx,fy);fa[fy]=fx;sz[fx]+=sz[fy];s[x]=make_pair(fy,fx);ans[op]++;}else s[x]=make_pair(0,0);
}void erase(int x,bool op){if(s[x].first){fa[s[x].first]=s[x].first;sz[s[x].second]-=sz[s[x].first];ans[op]--;}
}void ga(int now,int l=1,int r=m){for(int i=0;i<P[now].size();i++) insert(P[now][i].first,P[now][i].second);if(l==r) printf("%d %d\n",tot[l][1]-ans[1],tot[l][0]-ans[0]);else{int mid=(l+r)/2;ga(ls,l,mid);ga(rs,mid+1,r);}if(r!=m) for(int i=P[now].size()-1;i>=0;i--) erase(P[now][i].first,P[now][i].second);
}int main(){scanf("%d",&n);B=n*(n-1);for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]),tot[0][a[i][j]]++;for(int i=1;i<=n;i++) for(int j=1;j<n;j++) if(a[i][j]==a[i][j+1]) V[(i-1)*(n-1)+j]=1;for(int j=1;j<=n;j++) for(int i=1;i<n;i++) if(a[i][j]==a[i+1][j]) V[B+(j-1)*(n-1)+i]=1;int x,y,tmp;for(int i=1;i<=n*n;i++) fa[i]=i,sz[i]=1;scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d %d",&x,&y);a[x][y]^=1;tot[i][0]=tot[i-1][0];tot[i][1]=tot[i-1][1];tot[i][a[x][y]]++;tot[i][a[x][y]^1]--;if(x>1){tmp=B+(y-1)*(n-1)+x-1;if(a[x][y]!=a[x-1][y] && V[tmp] && V[tmp]<i) add(1,V[tmp],i-1,make_pair(tmp,a[x-1][y]));else if(a[x][y]==a[x-1][y]) V[tmp]=i;}if(y>1){tmp=(x-1)*(n-1)+y-1;if(a[x][y]!=a[x][y-1] && V[tmp] && V[tmp]<i) add(1,V[tmp],i-1,make_pair(tmp,a[x][y-1]));else if(a[x][y]==a[x][y-1]) V[tmp]=i;}if(x<n){tmp=B+(y-1)*(n-1)+x;if(a[x][y]!=a[x+1][y] && V[tmp] && V[tmp]<i) add(1,V[tmp],i-1,make_pair(tmp,a[x+1][y]));else if(a[x][y]==a[x+1][y]) V[tmp]=i;}if(y<n){tmp=(x-1)*(n-1)+y;if(a[x][y]!=a[x][y+1] && V[tmp] && V[tmp]<i) add(1,V[tmp],i-1,make_pair(tmp,a[x][y+1]));else if(a[x][y]==a[x][y+1]) V[tmp]=i;}}for(int i=1;i<=n;i++) for(int j=1;j<n;j++) if(a[i][j]==a[i][j+1]) add(1,V[(i-1)*(n-1)+j],m,make_pair((i-1)*(n-1)+j,a[i][j]));for(int j=1;j<=n;j++) for(int i=1;i<n;i++) if(a[i][j]==a[i+1][j]) add(1,V[B+(j-1)*(n-1)+i],m,make_pair(B+(j-1)*(n-1)+i,a[i][j]));ga(1);
}

[WC2005]双面棋盘,洛谷P4121,线段树分治+可撤销并查集相关推荐

  1. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  2. 【CF813F】Bipartite Checking(线段树分治+可删除并查集)

    文章目录 title solution code title You are given an undirected graph consisting of n vertices. Initially ...

  3. 洛谷 P3373 线段树2

    洛谷 P3373 线段树2 mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum 只有在传递给子序列之后,父序列的lz标记才能清零.其他时候,lz标记只增不减 #include ...

  4. 洛谷P3373线段树

    洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...

  5. 洛谷3373 线段树模板

    题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...

  6. 洛谷P3373线段树2

    题目描述 区间查询区间修改,非常明显的线段树模板,但乘法和加法的结合,使问题有了些小改动: problem: 该题唯一的难点就是加法和乘法的lazytag的处理,设目前区间N.s(即区间和)=x,若先 ...

  7. 洛谷P3373 线段树2(乘法加法lazytag)

    线段树模板题,含lazytag的线段树码量本身就比较大,再加入乘法标记,还要考虑先乘后加的问题,本蒟蒻一调就是几个小时. P3373 [模板]线段树 2https://www.luogu.com.cn ...

  8. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  9. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

最新文章

  1. spark(1.1) mllib 源代码分析
  2. Android 5.1 修改系统默认语言
  3. 安装 | 手把手教你Android studio 3.5.2安装(安装教程)
  4. 缓存三大问题及解决方案
  5. 如何通俗理解拉格朗日对偶问题(part1)
  6. 第一章 初始MySQL
  7. linux用户登录指定目录
  8. Linux系统编程30:进程信号之产生信号的四种方式(Core Dump,kill,raise)
  9. “HTTPS”安全在哪里?
  10. bp神经网络测试_BP 神经网络驱动的手写体数字识别软件 EasyOCR
  11. 链表——【线性表(二)】
  12. Java Agent实战
  13. 苹果电脑操作系统的演变历程
  14. linux中用tailf实时观看tomcat日志
  15. android:ems 属性
  16. 复习笔记1-java基础
  17. android generated java files,Android protobuf-javalite 实践
  18. 怎么把数据文件上传云服务器,如何将数据上传到云服务器上
  19. 【生成对抗网络 论文泛读】……pix2pix pix2pixhd……
  20. WebGIS学习(九)WebGIS中的矢量查询(针对AGS和GeoServer)

热门文章

  1. python制作图形化成绩查询系统_怎样制作考试成绩在线查询系统呢?
  2. grom (一)连接Mysql数据库
  3. Tushare原学习文档(七 龙虎榜数据)
  4. Qt5.0行车记录仪项目(一)SQL数据库建立
  5. 动态模板templete
  6. strtol函数、strtoul函数
  7. 人工智能导论——搜索问题与技术
  8. Unity —— 智能巡逻兵
  9. 如何在微信推文中插入b站_视频引流:如何把B站的流量引流到微信?
  10. 【随笔】我为啥想写无关紧要的随笔?