【题解】

  这道题可以用Link-Cut Tree写。。

  首先建立一个虚拟节点N+1,$i$与$N+1$连边表示$i$被弹飞了

  对于修改操作,先$cut(i,min(n+1,i+k[i]))$,然后再$link(i,min(n+1,i+newk))$

  对于询问操作,先$makeroot(x)$,然后$splay(n+1)$,$access(n+1)$,那么答案就是$size[n+1]-1$

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define N (500010)
  4. #define ls (c[u][0])
  5. #define rs (c[u][1])
  6. using namespace std;
  7. int n,m,opt,k[N];
  8. inline int read(){
  9. int k=,f=; char c=getchar();
  10. while(c<''||c>'')c=='-'&&(f=-),c=getchar();
  11. while(''<=c&&c<='')k=k*+c-'',c=getchar();
  12. return k*f;
  13. }
  14. struct Link_Cut_Tree{
  15. int top,c[N][],fa[N],rev[N],size[N],q[N];
  16. inline void pushdown(int u){
  17. if(rev[u]) rev[ls]^=,rev[rs]^=,rev[u]^=,swap(ls,rs);
  18. }
  19. inline void pushup(int u){
  20. size[u]=;
  21. if(ls) size[u]+=size[ls];
  22. if(rs) size[u]+=size[rs];
  23. }
  24. inline bool isroot(int u){
  25. return c[fa[u]][]!=u&&c[fa[u]][]!=u;
  26. }
  27. inline bool which(int u){
  28. return c[fa[u]][]==u;
  29. }
  30. void rotate(int u){
  31. int f=fa[u],gf=fa[f],wh=which(u);
  32. if(!isroot(f)) c[gf][which(f)]=u;
  33. fa[u]=gf; fa[f]=u; fa[c[u][wh^]]=f;
  34. c[f][wh]=c[u][wh^]; c[u][wh^]=f;
  35. pushup(f); pushup(u);
  36. }
  37. void splay(int u){
  38. q[top=]=u;
  39. for(int i=u;!isroot(i);i=fa[i]) q[++top]=fa[i];
  40. for(int i=top;i;i--) pushdown(q[i]);
  41. while(!isroot(u)){
  42. if(!isroot(fa[u])) rotate(which(u)==which(fa[u])?fa[u]:u);
  43. rotate(u);
  44. }
  45. pushup(u);
  46. }
  47. void access(int u){
  48. for(int son=;u;son=u,u=fa[u])
  49. splay(u),c[u][]=son,pushup(u);
  50. }
  51. void makeroot(int u){
  52. access(u); splay(u); rev[u]^=;
  53. }
  54. int find(int u){
  55. access(u); splay(u);
  56. while(ls) u=ls; splay(u);
  57. return u;
  58. }
  59. void split(int x,int y){
  60. makeroot(x); access(y); splay(y);
  61. }
  62. void cut(int x,int y){
  63. int xrt=find(x),yrt=find(y);
  64. if(xrt!=yrt) return;
  65. split(x,y);
  66. if(c[y][]==x) c[y][]=,fa[x]=;
  67. pushup(y);
  68. }
  69. void link(int x,int y){
  70. int xrt=find(x),yrt=find(y);
  71. if(xrt==yrt) return;
  72. makeroot(x); fa[x]=y;
  73. }
  74. }t;
  75. int main(){
  76. n=read();
  77. for(int i=;i<=n;i++) t.link(i,min(n+,i+(k[i]=read())));
  78. m=read();
  79. while(m--){
  80. if((opt=read())==){
  81. int x=read()+;
  82. t.makeroot(x); t.access(n+); t.splay(n+);
  83. printf("%d\n",t.size[n+]-);
  84. }
  85. else{
  86. int x=read()+,y=read();
  87. if(x+y>n+&&x+k[x]>n+) continue;
  88. t.cut(x,min(n+,x+k[x]));
  89. t.link(x,min(n+,x+y));
  90. k[x]=y;
  91. }
  92. }
  93. return ;
  94. }

洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊的更多相关文章

  1. [BZOJ2002][洛谷P3203][Hnoi2010]Bounce 弹飞绵羊(LCT维护链长)

    luogu传送门 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 16082  Solved:  ...

  2. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

    [HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  3. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9071  Solved: 4652[Submi ...

  4. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree

    2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答 ...

  5. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  7. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  8. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 4055  Solved: 2172[Submi ...

  9. bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...

随机推荐

  1. javascript的call和apply

    coffeescript里,每个文件编译成JS后,都是(function(){...}).call(this);的架势 这个call,该怎么理解呢? 在javascript里面,call 或者 app ...

  2. 快速编译system.img和boot.img的方法【转】

    本文转载自:http://www.cnblogs.com/wanqieddy/archive/2012/10/22/2734024.html 快速编译system.img,可以使用这个命令: #mak ...

  3. 【转载】HashMap实现原理浅析

    HashMap和Hashtable的区别 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全Hashtable的实现方法里面都添加了synchronized关键字来确保线程 ...

  4. 使用php实现二叉搜索树

    看到一位大神写的js的搜索树,自己也按照模式写了一个php的二叉搜索树. <?phpclass node{ public $data; public $key; public $left=nul ...

  5. day01_12/11/2016_Spring入门PPT

    s1 s2 s3 s4 s5 s6 s7 s8 IOC1 IOC2 入门编写1 入门编写2 入门编写3 入门编写4---心得

  6. 设置靠近 水平居中的主体内容Div 的 左侧位置固定的Div

    示例效果: 1.主体内容的divMain 水平居中: 2.divLeft 靠近divMain ,位置固定,不随垂直滚动条而动: 相关代码: <html> <head runat=&q ...

  7. 重现apache commons fileupload DOS漏洞

    这个漏洞是2014年2月4日被发现的, 因为该组件试用范围非常广, 所以该漏洞的影响也非常巨大.通过特制的包含畸形header的http请求,可以导致使用该组件的应用程序进入无限循环从而耗尽CPU等资 ...

  8. html5——多媒体(二)

    基本方法 load() //重新加载视频 play() //播放 pause() //暂停 基本属性 currentTime //视频播放的当前进度. duration //视频的总时间 paused ...

  9. html5——文本阴影

    基本结构 text-shadow: 30px 23px 31px #;/* 文字阴影: 水平位移 垂直位移 模糊程度 阴影颜色*/ 凹凸文字 <!DOCTYPE html> <htm ...

  10. 转载:使用FileReader对象的readAsDataURL方法来读取图像文件

    文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...