bzoj1453: [Wc]Dface双面棋盘
来源:互联网 发布:linux 定时唤醒 编辑:程序博客网 时间:2024/05/01 00:59
传送门
话说数据范围好像暴力能过?不管,讲正解。
发现暴力每一次询问需要O(N^2)。
但是每一次只修改一个数。
感觉比较浪费。
然后我们可以按照行跑线段树,然后暴力合并上下联通情况。
这样单次询问只要O(NlogN)了。
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#define N 205using namespace std;struct node{ int u[N],d[N],s[2],l,r,;}t[N*5];int a[N][N],f[N*5],n,m,x,v[N*5],y;int get(int x){return x==f[x]?x:f[x]=get(f[x]);}node merge(node x,node y){ node tmp; tmp.l=x.l; tmp.r=y.r; for (int i=0;i<2;i++) tmp.s[i]=x.s[i]+y.s[i]; for (int i=1;i<=n;i++){ f[i]=x.u[i]; f[i+n]=x.d[i]; f[i+n*2]=y.u[i]+2*n; f[i+n*3]=y.d[i]+2*n; } for (int i=1;i<=n;i++) if (a[x.r][i]==a[x.r+1][i]){ int p=get(i+n),q=get(i+n*2); if (p!=q) f[q]=p,tmp.s[a[x.r][i]]--; } memset(v,0,sizeof(v)); for (int i=1;i<=n;i++){ tmp.u[i]=get(i); if (!v[tmp.u[i]]) v[tmp.u[i]]=i; tmp.u[i]=v[tmp.u[i]]; tmp.d[i]=get(i+3*n); if (!v[tmp.d[i]]) v[tmp.d[i]]=i+n; tmp.d[i]=v[tmp.d[i]]; } return tmp;}void build(int k,int l,int r){ t[k].l=l,t[k].r=r; if (l==r){ t[k].u[1]=t[k].d[1]=t[k].s[a[l][1]]=1; for (int i=2;i<=n;i++) if (a[l][i]==a[l][i-1]) t[k].u[i]=t[k].d[i]=t[k].u[i-1]; else t[k].u[i]=t[k].d[i]=i,t[k].s[a[l][i]]++; return; } int m=(l+r)/2; build(k*2,l,m); build(k*2+1,m+1,r); t[k]=merge(t[k*2],t[k*2+1]);}void change(int k,int p){ int l=t[k].l,r=t[k].r; if (l==r){ t[k].u[1]=t[k].d[1]=t[k].s[a[l][1]]=1; t[k].s[1-a[l][1]]=0; for (int i=2;i<=n;i++) if (a[l][i]==a[l][i-1]) t[k].u[i]=t[k].d[i]=t[k].u[i-1]; else t[k].u[i]=t[k].d[i]=i,t[k].s[a[l][i]]++; return; } int m=(l+r)/2; if (p<=m) change(k*2,p); else change(k*2+1,p); t[k]=merge(t[k*2],t[k*2+1]);}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&a[i][j]); build(1,1,n); scanf("%d",&m); for (int i=1;i<=m;i++){ scanf("%d%d",&x,&y); a[x][y]=1-a[x][y]; change(1,x); printf("%d %d\n",t[1].s[1],t[1].s[0]); }}
0 0
- BZOJ1453: [Wc]Dface双面棋盘
- bzoj1453: [Wc]Dface双面棋盘
- BZOJ1453——[Wc]Dface双面棋盘
- [BZOJ1453][Wc]Dface双面棋盘(lct)
- 【WC2005】【BZOJ1453】Dface双面棋盘
- [Wc]Dface双面棋盘
- WC 2005 dface 双面棋盘
- 1453: [Wc]Dface双面棋盘 (线段树+并茶几)
- BZOJ1453 WCDface 双面棋盘
- [CDQ分治 并查集] BZOJ 1453 [Wc]Dface双面棋盘
- BZOJ 1453 Wc2005 Dface双面棋盘 Link-Cut-Tree
- 【BZOJ】【P1453】【WC2005】【Dface双面棋盘】【题解】【线段树+并查集】
- BZOJ 1453 [WC] 双面棋盘 并查集+线段树暴搞
- bzoj 1453 双面棋盘 LCT 并查集
- wc
- wc
- wc
- wc
- 原生ajax
- Android 画画板
- Maven实战之Web项目部署
- java中的final关键字
- SpringBoot实战 之 异常处理篇
- bzoj1453: [Wc]Dface双面棋盘
- 坚持#第176天~从容面对,微笑面对危险、不忘初心晨、我喜欢触控时的我
- 51Nod-1328-比赛往事
- 蓝桥杯 基础练习 字母图形 JAVA
- 递归读取文件夹下的文件
- 【23种设计模式】之 访问者模式(Visitor Pattern )
- Java实践(二)---Java常用集合
- 三角形面积计算
- SAPUI5拓展标准应用的View原理分析及应用实践