[bzoj3514]: Codechef MARCH14 GERALD07加强版
2016-03-04 18:50
330 查看
跪了半天题解才会。。TAT
http://hzwer.com/4358.html
View Code
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
相关文章推荐
- uva 11300(分金币)
- Java HashSet的实现原理详解
- hdu 3460 Ancient Printer 解题报告
- CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
- 柯里化的一点小理解
- JSP的四种基本语法
- setGeometry: Unable to set geometry 72x15+640+276 on QWidgetWindow/'QLabelClassWindow'. Resulting ge
- JAVA 多进程与多线程的概念
- HTML5移动端手机网站开发流程
- 请求转发与请求重定向的区别
- 2、二叉树:递归遍历
- Linq实例
- Spring MVC 异常处理最佳实践
- Android使用Messenger进行Service IPC通信分析
- 【VS开发】内存映射文件3
- 10692 XYM-入门之道
- [BZOJ3611] [Heoi2014]大工程
- bzoj2143 飞飞侠 最短路
- poj 3723 Conscription(最大生成树)
- 字符串常量举例