[Wc]Dface双面棋盘
来源:互联网 发布:小公司网络需求调查表 编辑:程序博客网 时间:2024/05/11 10:08
Description
Input
Output
Sample Input
Sample Output
HINT
Source
鸣谢刘汝佳先生授权使用
思路
线段树,树上的节点
代码
#include <cstdio>const int maxn=500;int map[maxn+10][maxn+10],n;int tmp[(maxn<<2)+10];struct data{ int fa[(maxn<<2)+10],b,w,tot,left,right; int find(int x) { if(fa[x]==x) { return x; } else { return fa[x]=find(fa[x]); } } int init(int x) { b=w=0; left=right=x; for(register int i=1; i<=n; ++i) { fa[i]=i; } for(register int i=1; i<=n; ++i) { if((i==1)||(map[x][i-1]!=map[x][i])) { if(map[x][i]) { ++b; } else { ++w; } } else { fa[find(i)]=fa[find(i-1)]; } } for(register int i=1; i<=n; ++i) { fa[i+n]=fa[i]; } return 0; } data operator +(data other)//合并两个区间 { data res; res.left=left; res.right=other.right; int mid=(res.left+res.right)>>1; res.b=b+other.b; res.w=w+other.w; for(register int i=1; i<=n<<1; ++i) { res.fa[i]=fa[i]; } for(register int i=1; i<=n<<1; ++i) { res.fa[i+(n<<1)]=other.fa[i]+(n<<1); } for(register int i=1; i<=n; ++i) { if(map[mid][i]==map[mid+1][i]) { int x=res.find(i+n),y=res.find(i+(n<<1)); if(x!=y) { if(map[mid][i]) { --res.b; } else { --res.w; } res.fa[x]=y; } } } for(register int i=1; i<=n<<2; ++i) { if(i<=n) { tmp[res.find(i)]=i; } if(i>n*3) { tmp[res.find(i)]=i-(n<<1); } } for(register int i=1; i<=n; ++i) { res.fa[i]=tmp[res.fa[i]]; res.fa[i+n]=tmp[res.fa[i+n*3]]; } return res; }};struct segment_tree{ data val[maxn+10]; int build(int now,int left,int right) { if(left==right) { val[now].init(left); return 0; } int mid=(left+right)>>1; build(now<<1,left,mid); build(now<<1|1,mid+1,right); val[now]=val[now<<1]+val[now<<1|1]; return 0; } int modify(int now,int left,int right,int pos) { if(left==right) { val[now].init(left); return 0; } int mid=(left+right)>>1; if(pos<=mid) { modify(now<<1,left,mid,pos); } else { modify(now<<1|1,mid+1,right,pos); } val[now]=val[now<<1]+val[now<<1|1]; return 0; }};segment_tree st;int m,a,b;inline int read(){ int x=0,f=1; char ch=getchar(); while((ch<'0')||(ch>'9')) { if(ch=='-') { f=-f; } ch=getchar(); } while((ch>='0')&&(ch<='9')) { x=x*10+ch-'0'; ch=getchar(); } return x*f;}int main(){ n=read(); for(register int i=1; i<=n; ++i) { for(register int j=1; j<=n; ++j) { map[i][j]=read(); } } st.build(1,1,n); m=read(); while(m--) { a=read(); b=read(); map[a][b]=1-map[a][b]; st.modify(1,1,n,a); printf("%d %d\n",st.val[1].b,st.val[1].w); } return 0;}
阅读全文
0 0
- [Wc]Dface双面棋盘
- WC 2005 dface 双面棋盘
- BZOJ1453: [Wc]Dface双面棋盘
- bzoj1453: [Wc]Dface双面棋盘
- BZOJ1453——[Wc]Dface双面棋盘
- [BZOJ1453][Wc]Dface双面棋盘(lct)
- 1453: [Wc]Dface双面棋盘 (线段树+并茶几)
- 【WC2005】【BZOJ1453】Dface双面棋盘
- [CDQ分治 并查集] BZOJ 1453 [Wc]Dface双面棋盘
- BZOJ 1453 Wc2005 Dface双面棋盘 Link-Cut-Tree
- 【BZOJ】【P1453】【WC2005】【Dface双面棋盘】【题解】【线段树+并查集】
- BZOJ 1453 [WC] 双面棋盘 并查集+线段树暴搞
- BZOJ1453 WCDface 双面棋盘
- bzoj 1453 双面棋盘 LCT 并查集
- wc
- wc
- wc
- wc
- Ripple Labs 为什么能获得 Google Ventures、IDG 资本等风投机构青睐
- android技巧篇
- 单反入门拍摄
- DJANGO 2.0变化
- Android 开发之多线程处理、Handler
- [Wc]Dface双面棋盘
- KEYCODE
- Linux下.ko, .o, .so, .a, .la,.lo文件
- SlidingMenu属性详解
- StrictMode 使用
- 我的一些总结
- vs2015 编译 leela zero
- 利用Sqoop将MySQL海量测试数据导入HDFS和HBase
- StringUtils中 isNotEmpty 和isNotBlank的区别