GERALD07

Description

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

Input

第一行四个整数N、M、K、type,代表点数、边数、询问数以及询问是否加密。

接下来M行,代表图中的每条边。

接下来K行,每行两个整数L、R代表一组询问。对于type=0的测试点,读入的L和R即为询问的L、R;对于type=1的测试点,每组询问的L、R应为L xor lastans和R xor lastans。

Output

K行每行一个整数代表该组询问的联通块个数。

Sample Input

3 5 4 0

1 3

1 2

2 1

3 2

2 2

2 3

1 5

5 5

1 2

Sample Output

2

1

3

1

HINT

对于100%的数据,1≤N、M、K≤200,000。

hzwer的题解

连通块的个数可以用n-生成树的边数来计算。

有一个比较猎奇的做法:首先把边依次加到图中,若当前这条边与图中的边形成了环,那么把这个环中最早加进来的边弹出去,并将每条边把哪条边弹了出去记录下来:ntr[i] = j,特别地,要是没有弹出边,ntr[i] = 0;

这个可以用LCT来弄。

然后对于每个询问,我们的对l~r中ntr小于l的边计数,并用n减去这个值。

正确性可以YY一下:

  • 如果一条边的ntr >= l,那么显然他可以与从l ~ r中的边形成环,那么它对答案没有贡献。
  • 反之如果一条边的ntr < l那么它与从l ~ r中的边是不能形成环的,那么他对答案的贡献为-1。

对于查询从l ~ r中有多少边的ntr小于l,我反正是用的函数式线段树。时间复杂度\(O((M+K)\log N)\)。

  1. co int N=4e5+1,M=2e5+1,INF=0x3f3f3f3f;
  2. bool type;
  3. int n,m,Q,lastans,top,tot,sz;
  4. int s[N],st[M],root[M];
  5. int c[N][2],fa[N],val[N],mn[N];
  6. int sum[4000005],ls[4000005],rs[4000005];
  7. bool rev[N];
  8. struct edge{int u,v;}e[M];
  9. bool isroot(int x){
  10. return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;
  11. }
  12. void update(int x){
  13. int l=c[x][0],r=c[x][1];
  14. mn[x]=x;
  15. if(val[mn[l]]<val[mn[x]]) mn[x]=mn[l];
  16. if(val[mn[r]]<val[mn[x]]) mn[x]=mn[r];
  17. }
  18. void pushdown(int x){
  19. int l=c[x][0],r=c[x][1];
  20. if(rev[x]){
  21. std::swap(c[x][0],c[x][1]);
  22. rev[l]^=1,rev[r]^=1,rev[x]=0;
  23. }
  24. }
  25. void rotate(int x){
  26. int y=fa[x],z=fa[y],l,r;
  27. l=c[y][1]==x,r=l^1;
  28. if(!isroot(y)) c[z][c[z][1]==y]=x;
  29. fa[y]=x,fa[x]=z,fa[c[x][r]]=y;
  30. c[y][l]=c[x][r],c[x][r]=y;
  31. update(y),update(x);
  32. }
  33. void splay(int x){
  34. top=0,s[++top]=x;
  35. for(int i=x;!isroot(i);i=fa[i]) s[++top]=fa[i];
  36. for(int i=top;i;--i) pushdown(s[i]);
  37. while(!isroot(x)){
  38. int y=fa[x],z=fa[y];
  39. if(!isroot(y)) rotate(c[y][0]==x^c[z][0]==y?x:y);
  40. rotate(x);
  41. }
  42. }
  43. void access(int x){
  44. for(int t=0;x;x=fa[t=x])
  45. splay(x),c[x][1]=t,update(x);
  46. }
  47. void makeroot(int x){
  48. access(x),splay(x),rev[x]^=1;
  49. }
  50. void link(int x,int y){
  51. makeroot(x),fa[x]=y;
  52. }
  53. void cut(int x,int y){
  54. makeroot(x),access(y),splay(y);
  55. c[y][0]=fa[x]=0;
  56. }
  57. int find(int x){
  58. access(x),splay(x);
  59. while(c[x][0]) x=c[x][0];
  60. return x;
  61. }
  62. int query(int x,int y){
  63. makeroot(x),access(y),splay(y);
  64. return mn[y];
  65. }
  66. void insert(int l,int r,int x,int&y,int val){
  67. y=++sz;
  68. sum[y]=sum[x]+1;
  69. if(l==r) return;
  70. ls[y]=ls[x],rs[y]=rs[x];
  71. int mid=(l+r)>>1;
  72. if(val<=mid) insert(l,mid,ls[x],ls[y],val);
  73. else insert(mid+1,r,rs[x],rs[y],val);
  74. }
  75. int query(int l,int r,int x,int y,int val){
  76. if(r==val) return sum[y]-sum[x];
  77. int mid=(l+r)>>1;
  78. if(val<=mid) return query(l,mid,ls[x],ls[y],val);
  79. else return sum[ls[y]]-sum[ls[x]]+query(mid+1,r,rs[x],rs[y],val);
  80. }
  81. int main(){
  82. // freopen(".in","r",stdin);
  83. // freopen(".out","w",stdout);
  84. read(n),read(m),read(Q),read(type);
  85. val[0]=INF;
  86. for(int i=1;i<=n;++i) mn[i]=i,val[i]=INF;
  87. for(int i=1;i<=m;++i)
  88. read(e[i].u),read(e[i].v);
  89. tot=n;
  90. for(int i=1;i<=m;++i){
  91. int u=e[i].u,v=e[i].v;
  92. if(u==v){
  93. st[i]=i;continue;
  94. }
  95. if(find(u)==find(v)){
  96. int t=query(u,v),x=val[t];
  97. st[i]=x;
  98. cut(e[x].u,t),cut(e[x].v,t);
  99. }
  100. ++tot;
  101. mn[tot]=tot,val[tot]=i;
  102. link(u,tot),link(v,tot);
  103. }
  104. for(int i=1;i<=m;++i)
  105. insert(0,m,root[i-1],root[i],st[i]);
  106. for(int i=1;i<=Q;++i){
  107. int l=read<int>(),r=read<int>();
  108. if(type) l^=lastans,r^=lastans;
  109. lastans=n-query(0,m,root[l-1],root[r],l-1);
  110. printf("%d\n",lastans);
  111. }
  112. return 0;
  113. }

BZOJ3514 GERALD07加强版的更多相关文章

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

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

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

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

  3. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

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

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

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

  5. bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树

    Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1951  Solved: 746[Submi ...

  6. [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)

    [BZOJ3514] Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES) 题意 \(N\) 个点 \(M\) 条边的无向图,\(K\) 次询问保 ...

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

    从左到右加边, 假如+的边e形成环, 那么记下这个环上最早加入的边_e, 当且仅当询问区间的左端点> _e加入的时间, e对答案有贡献(脑补一下). 然后一开始是N个连通块, 假如有x条边有贡献 ...

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

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

  9. BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT

    BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. I ...

随机推荐

  1. burpsuite破解网页密码

    1.暴力破解网页登录 http://jingyan.baidu.com/article/200957619c8739cb0721b4ff.html https://zhuanlan.zhihu.com ...

  2. context.xml文件配置

    <?xml version='1.0' encoding='utf-8'?> <Context> <WatchedResource>WEB-INF/web.xml& ...

  3. 洛谷 题解 P1550 【[USACO08OCT]打井Watering Hole】

    本题看似很难,实际上思路非常简单--如果你想通了. 首先有一个问题:图中有几个点?大部分的人会回答\(n\)个点.错了,有\(n+1\)个. 多出来的那个点在哪?关键在于你要理解每一个决策的意义.实际 ...

  4. quartz定时任务存储

    今天不聊quartz的概念,像任务bean,触发器,调度器这些随随便便都可以百度到,其中任务bean要实现job接口.对于这些创建生成的定时任务,它可以保存在内存中,重启失效,也可以保存在数据库里重启 ...

  5. vue-scroller 滑动组件使用指南

    在页面中经常会用到滚动,下拉刷新,下拉加载等功能,vux的scroller可以使用,但是它不再维护,而且要配合load-more组件一起使用.所以一般在项目中我都是用vue-scroller. vue ...

  6. C++打印乘法表

    #include <iostream> #include <Windows.h> #include <iomanip> using namespace std; i ...

  7. Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退

    在 Android 7.0 之前 Google 提供的动态申请权限的 API,可以调用相机拍照,访问SDcard等操作都只需要申请对应的权限,如下: <uses-permission andro ...

  8. Spring AOP日志实现(二)--获取访问者IP及访问路径

    获取类及方法上的@RequestMapping注解: 应该是不等于: 获取访问者的ip地址,首先配置一个监听器: 配置完监听器后,就可以在类中注入一个HttpServletRequest: 获取ip:

  9. 游记-NOI2019

    Day -18 被各路julao们轮番吊打-- Day -12 鸽子F发布了笔试题库,然而并没有 "MLE全场记零分" 的操作 Day -8 广二体育馆机器装配完毕,误闯开幕式表演 ...

  10. gulp删除目标文件中所有的console.log()语句——gulp-strip-debug

    1.安装npm包 npm install --save-dev gulp-strip-debug 2.使用 const gulp = require('gulp'); const stripDebug ...