BZOJ1018 [SHOI2008]堵塞的交通traffic

来源:互联网 发布:手机编辑音频软件 编辑:程序博客网 时间:2024/06/10 22:56

线段树分治裸题

把每条边存在的区间建到线段树上,然后深搜线段树,按秩合并并查集维护连通块,回溯的时候回滚操作

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 200010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8int n;int c[MAXN];int v1[MAXN],v2[MAXN];int l[MAXN],r[MAXN],X[MAXN],Y[MAXN];int at[MAXN],av1[MAXN],av2[MAXN];bool ans[MAXN];int f[MAXN];int d[MAXN];vector<int>es[MAXN<<2];int ma,mc;int m,T;int wzh;int *stp[MAXN*2];int stv[MAXN*2],tp;map<pair<int,int>,bool>h;map<pair<int,int>,int>st;int pt(int x,int y){return (x-1)*n+y;}int fa(int x){return f[x]==x?x:fa(f[x]);}void ins(int x,int y,int z,int l,int r,int iv){if(y==l&&z==r){es[x].push_back(iv);return ;}int mid=y+z>>1;if(r<=mid){ins(x<<1,y,mid,l,r,iv);}else if(l>mid){ins(x<<1|1,mid+1,z,l,r,iv);}else{ins(x<<1,y,mid,l,mid,iv);ins(x<<1|1,mid+1,z,mid+1,r,iv);}}void cot(int x,int y){int fx=fa(x),fy=fa(y);if(d[fx]<d[fy]){swap(x,y);swap(fx,fy);}if(d[fx]==d[fy]){stp[++tp]=&d[fx];stv[tp]=d[fx];d[fx]++;}stp[++tp]=&f[fy];stv[tp]=f[fy];f[fy]=fx;}void del(int x){while(tp!=x){(*stp[tp])=stv[tp];tp--;}}void dfs(int x,int y,int z){int i;int now=tp;for(i=0;i<es[x].size();i++){cot(X[es[x][i]],Y[es[x][i]]);}if(y==z){while(wzh<=ma&&at[wzh]==y){ans[wzh]=(fa(av1[wzh])==fa(av2[wzh]));wzh++;}del(now);return ;}int mid=y+z>>1;dfs(x<<1,y,mid);dfs(x<<1|1,mid+1,z);del(now);}int main(){int i;char o[10];int x,y,xx,yy;scanf("%d",&n);while(scanf("%s",o)){if(o[0]=='E'){break;}scanf("%d%d%d%d",&x,&y,&xx,&yy);m++;if(o[0]=='O'){c[m]=1;}if(o[0]=='C'){c[m]=2;}if(o[0]=='A'){c[m]=0;}v1[m]=pt(x,y);v2[m]=pt(xx,yy);}for(i=1;i<=m;i++){T++;pair<int,int>t=make_pair(v1[i],v2[i]);if(!c[i]){ma++;at[ma]=T;av1[ma]=v1[i];av2[ma]=v2[i];}if(c[i]==1){if(!h[t]){st[t]=T;}h[t]=1;}if(c[i]==2){if(h[t]){mc++;l[mc]=st[t];r[mc]=T-1;X[mc]=v1[i];Y[mc]=v2[i];}h[t]=0;}}for(i=1;i<=m;i++){if(c[i]==1){pair<int,int>t=make_pair(v1[i],v2[i]);if(h[t]){mc++;l[mc]=st[t];r[mc]=T;X[mc]=v1[i];Y[mc]=v2[i];}}}int N=pt(2,n);for(i=1;i<=N;i++){f[i]=i;}for(i=1;i<=mc;i++){ins(1,1,T,l[i],r[i],i);}wzh=1;dfs(1,1,T);for(i=1;i<=ma;i++){printf(ans[i]?"Y\n":"N\n");}return 0;}/*2Open 1 1 1 2Open 1 2 2 2Ask 1 1 2 2Ask 2 1 2 2Exit*/


0 0
原创粉丝点击