Codechef MARCH14 GERALD07加强版
2016-04-08 00:10
344 查看
Codechef MARCH14 GERALD07加强版
题目描述传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3514
题解
题解放这里会被莫名吞,所以放在代码里。代码
/* 我们需要知道每条边对于答案的贡献。 如果这条边是树边,那么贡献为-1,否则贡献为0。 所以我们需要维护每条边在一段区间内是否为树边。 这个问题可以用lct来做。 每次插入一条边,如果当前连通块已经连通,则将该连通块加入时间最小的一条边剔除。 然后,将这条边加入森林中。 记录下每个点加入时被删除的边的编号,记为pre值。 查询的时候,考虑l~r的边,如果这条边的pre值<l,即这条边在当前边集中不构成环,那么贡献为-1,否则贡献为0。 每次询问的答案就是n+贡献值。 每次查询你需要知道一段区间内pre值<l的边的数量。 显然可以用主席树维护。 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<algorithm> #define inf 2100000000 #define N 200010 #define M 400010 using namespace std; int n,m,k,cyc,pre,cnt,s ,rt ,fa[M]; struct node{int a,b;}map ; struct point{int c[2],fa,num,minn,rev,pos;}; struct info{int lc,rc,size;}; int get(int x){return x^pre;} class lct { void update(int x) { int lc=t[x].c[0],rc=t[x].c[1]; t[x].minn=t[x].num;t[x].pos=x; if(t[lc].minn<t[x].minn) t[x].minn=t[lc].minn,t[x].pos=t[lc].pos; if(t[rc].minn<t[x].minn) t[x].minn=t[rc].minn,t[x].pos=t[rc].pos; } void pushdown(int x) { int lc=t[x].c[0],rc=t[x].c[1]; if(!t[x].rev)return; swap(t[lc].c[0],t[lc].c[1]);t[lc].rev^=1; swap(t[rc].c[0],t[rc].c[1]);t[rc].rev^=1; t[x].rev=0; } void rotate(int x,int k) { int y=t[x].fa,f=(t[t[y].fa].c[1]==y); pushdown(y);pushdown(x); if(!t[y].fa)fa[x]=fa[y]; t[x].fa=t[y].fa;t[t[y].fa].c[f]=x; t[y].c[k]=t[x].c[k^1];t[t[y].c[k]].fa=y; t[y].fa=x;t[x].c[k^1]=y; update(y); } void splay(int x,int des) { pushdown(x); if(x==des)return; while(t[x].fa!=des) { int y=t[x].fa,f=(t[y].c[1]==x); if(t[y].fa==des)rotate(x,f); else { if((t[t[y].fa].c[1]==y)==f) rotate(y,f),rotate(x,f); else rotate(x,f),rotate(x,f^1); } } update(x); } void access(int x) { for(int y=0;x;y=x,x=fa[x]) { splay(x,0); t[t[x].c[1]].fa=0;fa[t[x].c[1]]=x; t[x].c[1]=y;fa[y]=0;t[y].fa=x; update(x); } } int lca(int x,int y) { access(x); for(splay(y,0);fa[y];splay(y,0))y=fa[y]; return y; } public: point t[M]; int find(int x) { access(x);splay(x,0); while(t[x].c[0])x=t[x].c[0]; return x; } void link(int x,int y) { access(x);splay(x,0); swap(t[x].c[0],t[x].c[1]); t[x].rev^=1;fa[x]=y; } void cut(int x,int y) { access(x);splay(y,0); if(fa[y]==x)swap(x,y);splay(x,0); t[t[x].c[0]].fa=0; fa[t[x].c[0]]=fa[x]; t[x].c[0]=fa[x]=0; update(x); } int qry(int x,int y) { int pos=lca(x,y),res=pos; access(x);splay(x,0);splay(pos,x); if(t[t[pos].c[1]].minn<t[res].num)res=t[t[pos].c[1]].pos; access(y);splay(y,0);splay(pos,y); if(t[t[pos].c[1]].minn<t[res].num)res=t[t[pos].c[1]].pos; return res; } point make(int pos) { point res; res.fa=res.c[0]=res.c[1]=res.rev=0; res.minn=res.num=pos;res.pos=0; return res; } void work() { t[0]=make(inf); for(int i=1;i<=n;i++)t[i].minn=t[i].num=inf; } }T1; class func_seg_tree { public: info t[N*20];int cnt; void modify(int &x,int pre,int l,int r,int des,int val) { x=++cnt;t[x]=t[pre];t[x].size++; if(l==r)return; int mid=l+r>>1; if(des<=mid)modify(t[x].lc,t[pre].lc,l,mid,des,val); else modify(t[x].rc,t[pre].rc,mid+1,r,des,val); } int qry(int x,int l,int r,int des) { if(r==des)return t[x].size; int mid=l+r>>1; if(des<=mid)return qry(t[x].lc,l,mid,des); return t[t[x].lc].size+qry(t[x].rc,mid+1,r,des); } }T2; int main() { int a,b; scanf("%d%d%d%d",&n,&m,&k,&cyc); cnt=n;T2.cnt=0;T1.work(); for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b);map[i]=(node){a,b}; if(a==b){s[i]=i;continue;} if(T1.find(a)==T1.find(b)) { int x=T1.qry(a,b),e=T1.t[x].num;s[i]=e; T1.cut(x,map[e].a);T1.cut(x,map[e].b); } T1.t[++cnt]=T1.make(i);T1.t[cnt].pos=cnt; T1.link(a,cnt);T1.link(b,cnt); } for(int i=1;i<=m;i++) T2.modify(rt[i],rt[i-1],0,m,s[i],1); while(k--) { scanf("%d%d",&a,&b); if(cyc)a=get(a),b=get(b); int A=T2.qry(rt[b],0,m,a-1); int B=T2.qry(rt[a-1],0,m,a-1); printf("%d\n",pre=n-A+B); } return 0; }
相关文章推荐
- VijosP1443:银河英雄传说
- C语言问卷调查
- 图片_ _ Bitmap_Drawable_Image?
- 表格制作
- 《高质量C++/C编程指南》读书笔记二
- MYSQL开发性能研究之INSERT,REPLACE,INSERT-UPDATE性能比较
- RTC数据收集作业自动运行的时间
- 流程图组件区别
- 车载诊断协议概述
- 面试:数组:重叠区间个数
- 点线之间 类运算
- Java Math的floor、ceil、round方法
- android IPC机制讲解(三)
- 安全加密与证书签发工具--openssl
- 选择排序
- CSS禅意
- 几个面试常见算法
- 中国新中产的全球盛宴
- 小红书产品分析报告:社交电商的转型之路
- NopCommerce架构分析之(六)自定义RazorViewEngine和WebViewPage