题目描述

N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数。

题解

对于一个截止时间来说,越晚的变越好。

所以我们可以维护一颗以边的序号为关键字的最大生成树,然后用主席树维护一下。

询问直接在R的主席树里查就可以了。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define N 400002
  5. using namespace std;
  6. int f[N],a[N],n,m,type,k;
  7. inline int rd(){
  8. int x=;char c=getchar();bool f=;
  9. while(!isdigit(c)){if(c=='-')f=;c=getchar();}
  10. while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
  11. return f?-x:x;
  12. }
  13. inline int find(int x){return f[x]=f[x]==x?x:find(f[x]);}
  14. struct LCT{
  15. int ch[N][],fa[N],l[N],tr[N];bool rev[N];
  16. #define ls ch[x][0]
  17. #define rs ch[x][1]
  18. inline bool ge(int x){return ch[fa[x]][]==x;}
  19. inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
  20. inline void pushup(int x){
  21. tr[x]=x;
  22. if(ls&&a[tr[ls]]<a[tr[x]])tr[x]=tr[ls];if(rs&&a[tr[rs]]<a[tr[x]])tr[x]=tr[rs];
  23. }
  24. inline void rotate(int x){
  25. int y=fa[x],o=ge(x);
  26. ch[y][o]=ch[x][o^];fa[ch[y][o]]=y;
  27. if(!isroot(y))ch[fa[y]][ge(y)]=x;fa[x]=fa[y];
  28. fa[y]=x;ch[x][o^]=y;pushup(y);pushup(x);
  29. }
  30. inline void pushdown(int x){if(rev[x]){rev[x]^=;rev[ls]^=;rev[rs]^=;swap(ls,rs);}}
  31. inline void _pushdown(int x){if(!isroot(x))_pushdown(fa[x]);pushdown(x);}
  32. inline void splay(int x){
  33. _pushdown(x);
  34. while(!isroot(x)){
  35. int y=fa[x];
  36. if(isroot(y))rotate(x);
  37. else rotate(ge(x)==ge(y)?y:x),rotate(x);
  38. }
  39. }
  40. inline int findroot(int x){
  41. access(x);splay(x);pushdown(x);
  42. while(ls)x=ls,pushdown(x);return x;
  43. }
  44. inline void access(int x){for(int y=;x;y=x,x=fa[x])splay(x),ch[x][]=y,pushup(x);}
  45. inline void makeroot(int x){access(x);splay(x);rev[x]^=;}
  46. inline void split(int x,int y){makeroot(x);access(y);splay(y);}
  47. inline void link(int x,int y){makeroot(x);fa[x]=y;}
  48. inline void cut(int x,int y){split(x,y);fa[x]=ch[y][]=;pushup(y);}
  49. void dfs(int x){
  50. if(ls)dfs(ls);cout<<x<<" ";if(rs)dfs(rs);
  51. }
  52. #undef ls
  53. #undef rs
  54. }lct;
  55. int tot,ls[N*],rs[N*],sum[N*],T[N],ans;
  56. void upd(int &cnt,int pre,int l,int r,int x,int y){
  57. cnt=++tot;ls[cnt]=ls[pre];rs[cnt]=rs[pre];sum[cnt]=sum[pre]+y;
  58. if(l==r)return;
  59. int mid=(l+r)>>;
  60. if(mid>=x)upd(ls[cnt],ls[pre],l,mid,x,y);
  61. else upd(rs[cnt],rs[pre],mid+,r,x,y);
  62. }
  63. int query(int cnt,int l,int r,int L,int R){
  64. if(l>=L&&r<=R)return sum[cnt];
  65. int mid=(l+r)>>,ans=;
  66. if(mid>=L)ans+=query(ls[cnt],l,mid,L,R);
  67. if(mid<R)ans+=query(rs[cnt],mid+,r,L,R);
  68. return ans;
  69. }
  70. struct edge{int x,y;}b[N];
  71. int main(){
  72. n=rd();m=rd();k=rd();type=rd();
  73. for(int i=;i<=n;++i)f[i]=i;int x,y;
  74. for(int i=;i<=n;++i)a[i]=2e9;
  75. for(int i=;i<=m;++i){
  76. a[i+n]=i;
  77. x=rd();y=rd();T[i]=T[i-];b[i].x=x;b[i].y=y;
  78. if(x==y)continue;
  79. if(find(x)==find(y)){
  80. lct.split(x,y);
  81. int id=lct.tr[y];
  82. // lct.dfs(y);cout<<" ??? "<<x<<" "<<y<<" "<<id<<" "<<lct.findroot(y)<<endl;
  83. lct.cut(id,b[id-n].x);lct.cut(id,b[id-n].y);upd(T[i],T[i],,m,id-n,-);
  84. lct.link(x,i+n);lct.link(y,i+n);
  85. }else{
  86. lct.link(x,i+n);lct.link(y,i+n);
  87. int xx=find(x),yy=find(y);f[xx]=yy;
  88. }
  89. upd(T[i],T[i],,m,i,);
  90. }
  91. for(int i=;i<=k;++i){
  92. x=rd();y=rd();if(type)x^=ans,y^=ans;
  93. printf("%d\n",ans=n-query(T[y],,m,x,y));
  94. }
  95. return ;
  96. }

bzoj3514(LCT+主席树)的更多相关文章

  1. [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2177  Solved: 834 ...

  2. 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

    题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以 ...

  3. BZOJ3514:GERALD07加强版(LCT,主席树)

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...

  4. [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]

    题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...

  5. BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 501 ...

  6. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  7. BZOJ 3514: Codechef MARCH14 GERALD07加强版(LCT + 主席树)

    题意 \(N\) 个点 \(M\) 条边的无向图,询问保留图中编号在 \([l,r]\) 的边的时候图中的联通块个数. \(K\) 次询问强制在线. \(1\le N,M,K \le 200,000\ ...

  8. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  9. BZOJ 3514 GERALD07加强版 (LCT+主席树)

    题目大意:给定n个点m条边无向图,每次询问求当图中有编号为[L,R]的边时,整个图的联通块个数,强制在线 神题!(发现好久以前的题解没有写完诶) 我们要求图中联通块的个数,似乎不可搞啊. 联通块个数= ...

随机推荐

  1. VMware虚拟机中常见的问题汇总

    在使用虚拟机进行开发工作的时候,经常会遇到各种各样的问题, 总结再次, 防微杜渐 1. wget: unable to resolve host address的解决方法 原因分析: DNS域名解析的 ...

  2. 初步了解HTTP

    HTTP简介: HTTP:HyperText  Transfer Protocol 超文本传输协议,是因特网上使用最为广泛的一种网络传输议,是用于从万维网(www :world  wide web)服 ...

  3. Oracle行列转换case when then方法案例

    select (select name from t_area where id=areaid) 区域, end) 一月, end) 二月, end) 三月, end) 四月, end) 五月, en ...

  4. Jenkins整合SonarQube代码检测工具

    借鉴博客:https://blog.csdn.net/kefengwang/article/details/54377055 上面这博客写得挺详细的,挺不错.它这个博客没有提供下载的教程,这个博客提供 ...

  5. python之路--MySQL 库,表的详细操作

    一 库操作 数据库命名规则 可以由数字,字母,下划线,@, #, $ 区分大小写 唯一性 不能使用关键字如 create  select 不能单独使用数字 最长128位 # 这些是对上次的补充. 二 ...

  6. spring boot 获取bean

    在写测试用例的时候,如果是springboot的应该加上 springboot的标签: @SpringBootTest(classes = ApplicationLoader.class) @Acti ...

  7. Delphi窗体之间互相调用的简单问题

    问题是这样的,我的程序主窗口Form1上面有一个数据连接(ADOCONNECTION1)和ADOQUERY,然后还有一些数据感知组件用于浏览用的,我打算点击From1中的一个“修改数据”按钮,就弹出F ...

  8. Java多线程之线程状态转换图

    说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...

  9. LODOP打印控件进行批量打印

    Lodop打印控件批量打印的方式:1.批量打印每页内容相同的:(1)批量打印相同内容的很多纸张,可以设置打印份数,把该内容打印出多份.2.批量打印每页不同内容的:(1)通过在一个任务中分页,循环添加页 ...

  10. 如何安装或卸载Lodop、C-Lodop

    安装:下载.exe安装文件,一步步安装就行,如不特意拦截,应该是100%可以安装成功.客户端本地打印角色等,直接一步步安装就行,如果是广域网AO打印那种,在服务器上安装的c-lodop,需要勾选服务器 ...