hentai。。。

原题:

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

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

直接复制wulala的题解

wulala

葱娘说这是一个很巧妙的题。。
有一个比较猎奇的做法:首先把边依次加到图中,若当前这条边与图中的边形成了环,那么把这个环中最早加进来的边弹出去
并将每条边把哪条边弹了出去记录下来: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,我反正是用的函数式线段树

好妙啊

ntr。。。真是hentai,让我传承传承了hentai的po姐美好的意境吧

这题我写了一下午

T?WA我也认了T什么鬼啊
然后找rxz要来70M的数据。。。
突然想起来有些点是强制在线的,然后感觉就是我WA了
但是我把不强制在线的数据跑一下答案没错啊?
又从头到尾查一下,找不到毛病啊?
然后gdb,跟踪到第一个数据的时候……
一拍脑袋,发现last_ans没设初值。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. const int inf=(int)1e9;
  8. int rd(){int z=; char ch=getchar();
  9. while(ch<''||ch>'') ch=getchar();
  10. while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
  11. return z;
  12. }
  13. struct edg{int x,y;}e[];
  14. int n,m,o,mk;
  15. int fth[],chd[][],v[],mnv[],rvs[];
  16. int stck[],tp=;
  17. int ntr[],c[];
  18. int w[],cwd[][],rts[],ndc=;
  19. inline bool isrt(int x){ return (chd[fth[x]][]!=x)&(chd[fth[x]][]!=x);}
  20. inline void pshu(int x){ mnv[x]=min(v[x],min(mnv[chd[x][]],mnv[chd[x][]]));}
  21. inline void pshd(int x){
  22. if(!rvs[x]) return ;
  23. rvs[chd[x][]]^=,rvs[chd[x][]]^=,rvs[x]=;
  24. swap(chd[x][],chd[x][]);
  25. }
  26. void rtt(int x){
  27. int y=fth[x],z=fth[fth[x]],l,r;
  28. r=(chd[y][]==x); l=r^;
  29. if(!isrt(y)) chd[z][chd[z][]==y]=x;
  30. fth[x]=z,fth[y]=x,fth[chd[x][r]]=y;
  31. chd[y][l]=chd[x][r],chd[x][r]=y;
  32. pshu(y),pshu(x);
  33. }
  34. void sply(int x){
  35. stck[tp=]=x;
  36. for(int i=x;!isrt(i);i=fth[i]) stck[++tp]=fth[i];
  37. while(tp) pshd(stck[tp--]);
  38. while(!isrt(x)){
  39. if(!isrt(fth[x])) rtt((chd[fth[x]][]==x)^(chd[fth[fth[x]]][]==fth[x])?x:fth[x]);
  40. rtt(x);
  41. }
  42. }
  43. inline void accs(int x){ for(int i=;x;sply(x),chd[x][]=i,pshu(x),x=fth[i=x]);}
  44. inline void qdrt(int x){ accs(x),sply(x),rvs[x]^=;}
  45. inline void ct(int x,int y){ qdrt(x),accs(y),sply(y),chd[y][]=fth[x]=;}
  46. inline void lk(int x,int y){ qdrt(x),fth[x]=y,sply(x);}
  47. inline int gtrt(int x){ while(fth[x]) x=fth[x]; return x;}
  48. inline int sch(int x,int y){ qdrt(x),accs(y),sply(y); return mnv[y];}
  49. void ist(int x){
  50. if(e[x].x==e[x].y){ ntr[x]=x; return ;}
  51. if(gtrt(e[x].x)==gtrt(e[x].y)){
  52. ntr[x]=sch(e[x].x,e[x].y);
  53. ct(n+ntr[x],e[ntr[x]].x),ct(n+ntr[x],e[ntr[x]].y);
  54. mnv[n+ntr[x]]=inf;
  55. }
  56. mnv[n+x]=v[n+x]=x;
  57. lk(n+x,e[x].x),lk(n+x,e[x].y);
  58. }
  59. /*int bnrsch(int x){
  60. int l=1,r=m,md;
  61. while(l+1<r) md=(l+r)>>1,(c[md]>=x ? l : r)=md;
  62. return c[md]==l ? l : r;
  63. }*/
  64. int gtsgmttr(int l,int r){
  65. int x=++ndc,md=(l+r)>>;
  66. if(l!=r) cwd[x][]=gtsgmttr(l,md),cwd[x][]=gtsgmttr(md+,r);
  67. return x;
  68. }
  69. int mdf(int x,int l,int r,int y,int z){
  70. w[++ndc]=w[x],cwd[ndc][]=cwd[x][],cwd[ndc][]=cwd[x][],x=ndc;
  71. if(l==r){ w[x]+=z; return x;}
  72. int md=(l+r)>>;
  73. if(y<=md) cwd[x][]=mdf(cwd[x][],l,md,y,z);
  74. else cwd[x][]=mdf(cwd[x][],md+,r,y,z);
  75. w[x]=w[cwd[x][]]+w[cwd[x][]];
  76. return x;
  77. }
  78. int qur(int x,int l,int r,int ql,int qr){
  79. if(l==ql && r==qr) return w[x];
  80. int md=(l+r)>>;
  81. if(ql<=md && qr>md) return qur(cwd[x][],l,md,ql,md)+qur(cwd[x][],md+,r,md+,qr);
  82. else if(qr<=md) return qur(cwd[x][],l,md,ql,qr);
  83. else return qur(cwd[x][],md+,r,ql,qr);
  84. }
  85. int main(){//freopen("ddd.in","r",stdin);
  86. //freopen("ddd.out","w",stdout);
  87. int l,r,lst;
  88. cin>>n>>m>>o>>mk;
  89. fill(mnv,mnv+m+n+,inf),fill(v,v+m+n+,inf);
  90. for(int i=;i<=m;++i) e[i].x=rd(),e[i].y=rd(),ist(i);
  91. /*for(int i=1;i<=m;++i) c[i]=ntr[i];
  92. sort(c+1,c+m+1);
  93. for(int i=1;i<=m;++i) ntr[i]=bnrsch(ntr[i]);*/
  94. rts[]=gtsgmttr(,m);
  95. for(int i=;i<=m;++i) rts[i]=mdf(rts[i-],,m,ntr[i],);
  96. lst=;
  97. for(int i=;i<=o;++i){
  98. l=rd()^(mk*lst),r=rd()^(mk*lst);
  99. printf("%d\n",lst=n-qur(rts[r],,m,,l-)+qur(rts[l-],,m,,l-));
  100. }
  101. return ;
  102. }

【BZOJ3514】 Codechef MARCH14 GERALD07加强版的更多相关文章

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

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

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

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

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

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

  4. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...

  5. BZOJ3514 : Codechef MARCH14 GERALD07加强版

    以边编号为权值 用Link-cut Tree维护最大生成树 对于新加的第i条边(u,v) a[i]表示当a[i]这条边加入后连通块个数会减少 若u==v则a[i]=m 若u与v不连通则连上,a[i]= ...

  6. 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...

  7. BZOJ3514: Codechef MARCH14 GERALD07加强版【LCT】【主席树】【思维】

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

  8. BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)

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

  9. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树

    自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...

  10. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

随机推荐

  1. unity中制作模拟第一人称视角下的指南针

    private int zRotation; public GameObject obj; public void Update() { //obj = GameObject.Find("C ...

  2. MySQL远程登陆

    mysql:连接数据库 1.连接到本机上的MYSQL 命令:mysql -u [username] -p username:用户名 命令示例:mysql -u root -p,回车后提示你输密码. 2 ...

  3. Date与时间戳的相互转换(Java)

      1.Date对象转换为时间戳 Date date = new Date(); long times = date.getTime(); System.out.println(times); 效果如 ...

  4. TensorFlow学习笔记——节点(constant、placeholder、Variable)

    一. constant(常量) constant是TensorFlow的常量节点,通过constant方法创建,其是计算图(Computational Graph)中的起始节点,是传入数据. 创建方式 ...

  5. SQL-34 对于表actor批量插入如下数据

    题目描述 对于表actor批量插入如下数据CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,fir ...

  6. html页面技巧

    Query获取Select选择的Text和Value: 语法解释: 1. $("#select_id").change(function(){//code...});   //为S ...

  7. transclude

    http://jsfiddle.net/ospatil/A969Z/157/ transclude :true  允许指令内部的dom元素, 保留到 自定义指令的template属性里的含有 ng-t ...

  8. Ubuntu16.04 安装Tensorflow-CPU

    最近我开始学习深度学习框架Tensorflow,一开始在windows平台下的anaconda下安装,由于anaconda安装几次后navigator打开老是出现闪退的问题,所以决定换个ubuntu下 ...

  9. 100Mbps和100MB/s

    作为毕业2年计算机专业的学生,现在才知道100Mbps和100MB/s的概念,实在是渣. Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写传输速率是指设备的的数 ...

  10. jvm的基本结构以及各部分详解(转)

    原文链接:https://www.cnblogs.com/zwbg/p/6194470.html 1.java虚拟机的基本结构 图: 1.类加载器子系统从文件系统或者网络中加载Class信息,类信息( ...