[LCT && 主席树] BZOJ3514 .Codechef MARCH14 GERALD07 加强版
2017-09-18 21:39
399 查看
挺套路的题
如果我们对所有联通块取一棵生成树
那么联通块个数是点数减去边数(因为一棵树的点数-边数=1)
那么题目就是求这个区间里的边构成的图的生成树的边数
以加入的时间为权值,用LCT维护最大生成树,如果一条边加入图中会形成环,那么肯定要把这两点间的最小边删去后再加入边,设最小边权为k,那么就是要把1~k的边都删去后这条边才会存在在生成树上。
用主席树维护和查询就好了
如果我们对所有联通块取一棵生成树
那么联通块个数是点数减去边数(因为一棵树的点数-边数=1)
那么题目就是求这个区间里的边构成的图的生成树的边数
以加入的时间为权值,用LCT维护最大生成树,如果一条边加入图中会形成环,那么肯定要把这两点间的最小边删去后再加入边,设最小边权为k,那么就是要把1~k的边都删去后这条边才会存在在生成树上。
用主席树维护和查询就好了
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int N=600010; int n,m,k,t,cnt; int ls[N*20],rs[N*20],tot[N*20],rt ,fa ; struct edge{ int x,y; }e ; struct NODE{ NODE *ch[2],*fa; int mn,p,rev,w,g; }a ; inline int isl(NODE *x){ return !x->fa || (x->fa->ch[0]!=x && x->fa->ch[1]!=x); } inline int isr(NODE *x){ return x->fa && x->fa->ch[1]==x; } inline void Push(NODE *x){ if(!x || !x->rev) return ; swap(x->ch[0],x->ch[1]); if(x->ch[0]) x->ch[0]->rev^=1; if(x->ch[1]) x->ch[1]->rev^=1; x->rev=0; } inline void Up(NODE *x){ if(!x) return ; x->mn=x->w; x->p=x->g; if(x->ch[0] && x->ch[0]->mn<x->mn) x->mn=x->ch[0]->mn,x->p=x->ch[0]->p; if(x->ch[1] && x->ch[1]->mn<x->mn) x->mn=x->ch[1]->mn,x->p=x->ch[1]->p; } inline void rot(NODE *x){ NODE *y=x->fa,*z=y->fa; int wh=isr(x); if(!isl(y)) z->ch[isr(y)]=x; x->fa=z; if(y->ch[wh]=x->ch[wh^1]) y->ch[wh]->fa=y; (x->ch[wh^1]=y)->fa=x; Up(y); Up(x); } void PUSHTOP(NODE *x){ if(!isl(x)) PUSHTOP(x->fa); Push(x); } inline void splay(NODE *x){ PUSHTOP(x); for(;!isl(x);rot(x)) if(!isl(x->fa)) rot((isr(x)^isr(x->fa))?x:x->fa); } inline void access(NODE *x){ for(NODE *t=0;x;x=x->fa) splay(x),x->ch[1]=t,t=x,Up(x); } inline void reverse(NODE *x){ access(x); splay(x); x->rev^=1; } inline void link(NODE *x,NODE *y){ reverse(x); x->fa=y; access(x); } inline void cut(NODE *x,NODE *y){ reverse(x); access(y); splay(y); x->fa=y->ch[0]=0; Up(y); } inline void NEWNODE(NODE *x,int g=0,int w=1<<30){ x->fa=x->ch[0]=x->ch[1]=0; x->rev=0; x->p=g; x->g=g; x->w=x->mn=w; } inline int QueryMIN(NODE *x,NODE *y){ reverse(x); access(y); splay(y); return y->p; } inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void rea(int &x){ char c=nc(); x=0; for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc()); } int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); } void Modify(int &g,int l,int r,int x){ int k=g,mid=l+r>>1; g=++cnt; ls[g]=ls[k]; rs[g]=rs[k]; tot[g]=tot[k]+1; if(l==r) return ; if(x<=mid) Modify(ls[g],l,mid,x); else Modify(rs[g],mid+1,r,x); } int Query(int g,int l,int r,int L,int R){ if(l==L && r==R) return tot[g]; int mid=L+R>>1; if(r<=mid) return Query(ls[g],l,r,L,mid); else if(l>mid) return Query(rs[g],l,r,mid+1,R); return Query(ls[g],l,mid,L,mid)+Query(rs[g],mid+1,r,mid+1,R); } int main(){ rea(n); rea(m); rea(k); rea(t); for(int i=1;i<=m;i++) rea(e[i].x),rea(e[i].y); for(int i=1;i<=n;i++) NEWNODE(a+i),fa[i]=i; for(int i=1;i<=m;i++){ NEWNODE(a+n+i,i,i); rt[i]=rt[i-1]; if(e[i].x==e[i].y){ Modify(rt[i],0,m,m); //printf("%d ",m); continue; } if(find(e[i].x)==find(e[i].y)){ int k=QueryMIN(a+e[i].x,a+e[i].y); Modify(rt[i],0,m,k); //printf("%d ",k); k=QueryMIN(a+e[i].x,a+e[i].y); cut(a+e[k].x,a+n+k); cut(a+e[k].y,a+n+k); link(a+e[i].x,a+n+i); link(a+e[i].y,a+n+i); } else{ fa[find(e[i].x)]=find(e[i].y); Modify(rt[i],0,m,0); //printf("%d ",0); link(a+e[i].x,a+n+i); link(a+e[i].y,a+n+i); } } //putchar('\n'); int ans=0; for(int i=1,l,r;i<=k;i++){ rea(l); rea(r); l^=t*ans; r^=t*ans; if(l>r) swap(l,r); printf("%d\n",ans=n-(Query(rt[r],0,l-1,0,m)-Query(rt[l-1],0,l-1,0,m))); } return 0; }
相关文章推荐
- bzoj3514 Codechef MARCH14 GERALD07加强版 LCT&&主席树
- 【bzoj3514】GERALD07加强版 LCT+主席树
- 【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
- 【bzoj3514】【Codechef MARCH14 GERALD07加强版】【lct+主席树】
- [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
- BZOJ 3514 Codechef MARCH14 GERALD07加强版 LCT+主席树
- 【BZOJ3514】Codechef MARCH14 GERALD07加强版,LCT+主席树
- BZOJ 3514 Codechef MARCH14 GERALD07加强版 LCT+主席树
- 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
- 【bzoj3514】Codechef MARCH14 GERALD07加强版 link cut tree+主席树
- 【 bzoj 3514 】Codechef MARCH14 GERALD07加强版 - LCT
- BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT
- bzoj 3514: Codechef MARCH14 GERALD07加强版 lct+可持久化线段树
- bzoj3514:Codechef MARCH14 GERALD07加强版 关于一类LCT维护动态图的连通性问题
- 【LCT】【bzoj 3514】: Codechef MARCH14 GERALD07加强版
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
- [LCT 主席树] BZOJ 3514 Codechef MARCH14 GERALD07加强版
- bzoj 3514: GERALD07加强版 lct+可持久化线段树