BZOJ1018——[SHOI2008]堵塞的交通traffic
来源:互联网 发布:数据库pdforacle网盘 编辑:程序博客网 时间:2024/05/01 20:02
1、题意:给一个2*n大小的网格,让你动态的维护连通性。。
2、分析:用线段树来维护。另外不是很懂自测AC,交上去就是re的。。。
#include<map>#include<set>#include<cmath>#include<queue>#include<vector>#include<bitset>#include<string>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define M 1000010#define LL long long#define MOD 1000000007#define inf 2147483647#define llinf 4000000000000000000ll#define For(i,x,y) for(int i=(x);i<(y);i++)#define rep(i,x,y) for(int i=(x);i<=(y);i++)#define drep(i,x,y) for(int i=(x);i>=(y);i--)inline int read(){ char ch=getchar();int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}inline LL llread(){ char ch=getchar();LL x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}struct Node{ int a[3][3],ls,rs; Node(){a[0][0]=a[1][1]=0;a[1][0]=a[0][1]=0;ls=rs=0;} inline bool operator == (const Node& rhs) const{ return a[0][0]==rhs.a[0][0]&&a[0][1]==rhs.a[0][1]&&a[1][0]==rhs.a[1][0]&&a[1][1]==rhs.a[1][1]&&ls==rhs.ls&&rs==rhs.rs; } } q[M],null;string ch;int ri[2][M];inline Node pushup(int x,Node a,Node b,bool kt){ if(kt){if(a.ls==-1)return b;if(b.ls==-1)return a;} Node ret;ret.ls=a.ls|(b.ls&a.a[0][0]&a.a[1][1]&ri[0][x]&ri[1][x]); ret.rs=b.rs|(a.rs&b.a[0][0]&b.a[1][1]&ri[0][x]&ri[1][x]); ret.a[0][0]=(a.a[0][0]&b.a[0][0]&ri[0][x])|(a.a[0][1]&b.a[1][0]&ri[1][x]); ret.a[1][0]=(a.a[1][0]&b.a[0][0]&ri[0][x])|(a.a[1][1]&b.a[1][0]&ri[1][x]); ret.a[0][1]=(a.a[0][1]&b.a[1][1]&ri[1][x])|(a.a[0][0]&b.a[0][1]&ri[0][x]); ret.a[1][1]=(a.a[1][0]&b.a[0][1]&ri[0][x])|(a.a[1][1]&b.a[1][1]&ri[1][x]); return ret;}inline void build(int l,int r,int o){ if(l==r){q[o].a[0][0]=q[o].a[1][1]=1;return;}int mid=(l+r)/2; build(l,mid,2*o);build(mid+1,r,2*o+1);q[o]=pushup(mid,q[2*o],q[2*o+1],0);}inline void changed(int l,int r,int o,int x,int k){ if(l==r){For(i,0,2)For(j,0,2)if(i!=j)q[o].a[i][j]=k;q[o].ls=k;q[o].rs=k;return;}int mid=(l+r)/2; if(x<=mid)changed(l,mid,2*o,x,k);else changed(mid+1,r,2*o+1,x,k);q[o]=pushup(mid,q[2*o],q[2*o+1],0);}inline void changer(int l,int r,int o,int x,int y,int k){ if(l==r){ri[x][y]=k;return;}int mid=(l+r)/2; if(y<=mid)changer(l,mid,2*o,x,y,k);else changer(mid+1,r,2*o+1,x,y,k); q[o]=pushup(mid,q[2*o],q[2*o+1],0); }inline Node Ask(int l,int r,int o,int x,int y){ if(x<=l&&r<=y)return q[o];int mid=(l+r)/2;Node ret,ll,rr;ll.ls=rr.ls=-1; if(x<=mid)ll=Ask(l,mid,2*o,x,y);if(y>mid)rr=Ask(mid+1,r,2*o+1,x,y); ret=pushup(mid,ll,rr,1);return ret;}int main(){ int n=read();build(1,n,1);while(1){ cin>>ch;if(ch=="Exit")break;int x1=read(),y1=read(),x2=read(),y2=read(); if(ch=="Open"){ if(x1==x2&&y1==y2)continue; if(x1==x2){if(y1>y2)swap(y1,y2);changer(1,n,1,x1-1,y1,1);} else changed(1,n,1,y1,1); }else if(ch=="Close"){ if(x1==x2&&y1==y2)continue; if(x1==x2){if(y1>y2)swap(y1,y2);changer(1,n,1,x1-1,y1,0);} else changed(1,n,1,y1,0); }else if(ch=="Ask"){ x1--;x2--;if(x1==x2&&y1==y2){puts("Y");continue;} if(y1>y2)swap(x1,x2),swap(y1,y2);int ans=0; Node a=Ask(1,n,1,1,y1),b=Ask(1,n,1,y1,y2),c=Ask(1,n,1,y2,n); ans=b.a[x1][x2];if(x1==x2)ans|=(a.rs&c.ls&b.a[1-x1][1-x2]); else if(x1==0) ans|=(a.rs&b.a[1][1]),ans|=(c.ls&b.a[0][0]); else ans|=(a.rs&b.a[0][0]),ans|=(c.ls&b.a[1][1]); puts(ans?"Y":"N"); } } return 0;}
0 0
- BZOJ1018——[SHOI2008]堵塞的交通traffic
- 【bzoj1018】【SHOI2008】【堵塞的交通traffic】
- BZOJ1018 [SHOI2008]堵塞的交通traffic
- bzoj1018[SHOI2008]堵塞的交通traffic
- BZOJ1018: [SHOI2008]堵塞的交通traffic
- bzoj1018 [SHOI2008]堵塞的交通traffic
- bzoj1018 [SHOI2008]堵塞的交通traffic
- [bzoj1018]:[SHOI2008]堵塞的交通traffic
- bzoj1018: [SHOI2008]堵塞的交通traffic 线段树区间合并
- 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树维护连通性
- [BZOJ1018][SHOI2008]堵塞的交通traffic(线段树)
- bzoj1018 堵塞的交通traffic
- [SHOI2008]堵塞的交通traffic
- [SHOI2008]堵塞的交通traffic
- [BZOJ1018]SHOI2008堵塞的交通|线段树
- BZOJ1018 [SHOI2008]堵塞的交通traffic(分块+并查集)
- [BZOJ1018][SHOI2008]堵塞的交通traffic(线段树维护连通性)
- BZOJ1018 [SHOI2008]堵塞的交通traffic && 2459: [BeiJing2011]神秘好人 (含datamaker)
- Dijkstra + 堆优化
- AsyncDisplayKit2.0教程(下)
- C语言——fork函数
- 349. Intersection of Two Arrays [LeetCode]
- C. Timofey and a tree
- BZOJ1018——[SHOI2008]堵塞的交通traffic
- leetcode 36. Valid Sudoku
- jquery概览
- UVa340 Master-Mind Hints
- g2o库文件已上传
- 为什么年轻人越来越反感「亲戚」这群人?
- 1px像素的实现
- 老人是真饿了
- 算法训练 大小写转换