您的位置:首页 > 其它

BZOJ1018 [SHOI2008]堵塞的交通traffic

2016-05-18 18:24 363 查看
线段树分治裸题

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

#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-8
int 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;
}

/*
2
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: