您的位置:首页 > 其它

[bzoj3514]: Codechef MARCH14 GERALD07加强版

2016-03-04 18:50 330 查看
  跪了半天题解才会。。TAT

http://hzwer.com/4358.html

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=200233<<1;
const int inf=1000023333;
struct zs{
int u,v;
}e[200233];
int ch[maxn][2],fa[maxn],mnpos[maxn],st[maxn],top;
bool rev[maxn],ty;
int lc[200233*30],rc[200233*30],sz[200233*30],rt[200233],ntr[200233];
int i,j,k,n,m,x,y,l,r,K,tot,ans,a;

int ra;char rx;
inline int read(){
ra=0,rx=getchar();
while(rx<'0'||rx>'9')rx=getchar();
while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
}
inline int min(int a,int b){return a<b?a:b;}
inline bool isrt(int x){
return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
inline void pushdown(int x){
if(!rev[x])return;

int l=ch[x][0],r=ch[x][1];
if(l)rev[l]^=1;if(r)rev[r]^=1;
swap(ch[x][0],ch[x][1]),rev[x]=0;
}
inline void upd(int x){
mnpos[x]=min(x<=m?x:inf,min(mnpos[ch[x][0]],mnpos[ch[x][1]]));
}
inline void rotate(int x){
int f=fa[x],gfa=fa[f],l=ch[f][1]==x,r=l^1;
if(!isrt(f))ch[gfa][ch[gfa][1]==f]=x;
fa[ch[f][l]=ch[x][r]]=f,fa[fa[ch[x][r]=f]=x]=gfa;
mnpos[x]=mnpos[f],upd(f);
}
inline void splay(int x){
int f=x,gfa;
for(st[top=1]=f;!isrt(f);st[++top]=(f=fa[f]));
while(top)pushdown(st[top--]);
while(!isrt(x)){
f=fa[x],gfa=fa[f];
if(!isrt(f))
rotate(((ch[f][1]==x)^(ch[gfa][1]==f))?x:f);
rotate(x);
}
}
inline void access(int x){
for(int rc=0;x;rc=x,x=fa[x])
splay(x),ch[x][1]=rc,upd(x);
}
inline void makert(int x){
access(x),splay(x),rev[x]^=1;
}
inline void link(int x,int y){
makert(x),fa[x]=y;
}
inline void cut(int x,int y){
makert(x),access(y),splay(y),fa[x]=ch[y][0]=0;
}
inline int getfa(int x){
for(access(x),splay(x);ch[x][0];x=ch[x][0]);
return x;
}

inline void insert(int pre,int &x,int a,int b,int v){
sz[x=++tot]=sz[pre]+1;
if(a==b)return;
int mid=(a+b)>>1;
if(v<=mid)rc[x]=rc[pre],insert(lc[pre],lc[x],a,mid,v);
else lc[x]=lc[pre],insert(rc[pre],rc[x],mid+1,b,v);
}
inline int query(int pre,int x,int a,int b,int d){
if(b<=d||!x)return sz[x]-sz[pre];
int mid=(a+b)>>1;
if(d<=mid)return query(lc[pre],lc[x],a,mid,d);
else return sz[lc[x]]-sz[lc[pre]]+query(rc[pre],rc[x],mid+1,b,d);
}
int main(){
n=read(),m=read(),K=read(),ty=read();
mnpos[0]=inf;
for(i=1;i<=m;i++)mnpos[i]=i;for(i=m+1;i<=n+m;i++)mnpos[i]=inf;

for(i=1;i<=m;i++){
e[i].u=x=read(),e[i].v=y=read();
x+=m,y+=m;
if(x!=y){
if(getfa(x)==getfa(y)){
makert(x),access(y),splay(y),ntr[i]=a=mnpos[y];
cut(e[a].u+m,a),cut(a,e[a].v+m);
}
link(x,i),link(i,y);
}else ntr[i]=i;
insert(rt[i-1],rt[i],0,m,ntr[i]);
//        printf("  %d  %d\n",i,ntr[i]);
}
while(K--){
l=read()^(ty?ans:0),r=read()^(ty?ans:0);
ans=n-query(rt[l-1],rt[r],0,m,l-1);
printf("%d\n",ans);
}
return 0;
}


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