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
原创粉丝点击