2002: [Hnoi2010]Bounce 弹飞绵羊

Time Limit: 10 Sec Memory Limit: 259 MB

Submit: 6801 Solved: 3573

[Submit][Status][Discuss]

Description

某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

Input

第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

Output

对于每个i=1的情况,你都要输出一个需要的步数,占一行。

Sample Input

4

1 2 1 1

3

1 1

2 1 1

1 1

Sample Output

2

3

HINT

Source

  1. LCT即可,需要维护子树的size,弹的时候处理好即可
  2. 分块也可做,等我搞定分块,再来搞搞

code:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. #define N 200100
  8. int read()
  9. {
  10. int x=0,f=1; char ch=getchar();
  11. while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  12. while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
  13. return x*f;
  14. }
  15. int f[N],son[N][2],tmp[N];bool rev[N];
  16. int next[N],size[N];
  17. bool isroot(int x)
  18. {
  19. return !f[x]||son[f[x]][0]!=x&&son[f[x]][1]!=x;
  20. }
  21. void rev1(int x)
  22. {
  23. if(!x) return;
  24. swap(son[x][0],son[x][1]);
  25. rev[x]^=1;
  26. }
  27. void pb(int x)
  28. {
  29. if(rev[x])
  30. rev1(son[x][0]),rev1(son[x][1]),rev[x]=0;
  31. }
  32. void updata(int x)
  33. {
  34. size[x]=size[son[x][0]]+size[son[x][1]]+1;
  35. }
  36. void rotate(int x)
  37. {
  38. int y=f[x],w=son[y][1]==x;
  39. son[y][w]=son[x][w^1];
  40. if(son[x][w^1]) f[son[x][w^1]]=y;
  41. if(f[y])
  42. {
  43. int z=f[y];
  44. if(son[z][0]==y)son[z][0]=x;
  45. else if(son[z][1]==y)son[z][1]=x;
  46. }
  47. f[x]=f[y];f[y]=x;
  48. son[x][w^1]=y;
  49. updata(x);updata(y);
  50. }
  51. void splay(int x)
  52. {
  53. int s=1,i=x,y;tmp[1]=i;
  54. while(!isroot(i)) tmp[++s]=i=f[i];
  55. while(s) pb(tmp[s--]);
  56. while(!isroot(x))
  57. {
  58. y=f[x];
  59. if(!isroot(y))
  60. {
  61. if((son[f[y]][0]==y)^(son[y][0]==x))
  62. rotate(x); else rotate(y);
  63. }
  64. rotate(x);
  65. }
  66. }
  67. void access(int x)
  68. {
  69. for(int y=0;x;y=x,x=f[x])
  70. splay(x),son[x][1]=y;
  71. }
  72. void makeroot(int x)
  73. {
  74. access(x);splay(x);rev1(x);
  75. }
  76. void link(int x,int y)
  77. {
  78. makeroot(x);
  79. f[x]=y;
  80. access(x);
  81. }
  82. void cutf(int x)
  83. {
  84. access(x);splay(x);
  85. f[son[x][0]]=0;son[x][0]=0;
  86. }
  87. void cut(int x,int y)
  88. {
  89. makeroot(x);cutf(y);
  90. }
  91. int n,m;
  92. int main()
  93. {
  94. n=read();
  95. for (int i=1; i<=n; i++)
  96. {
  97. int x=read();
  98. size[x]=1;
  99. f[i]=x+i;if (f[i]>n+1) f[i]=n+1;
  100. next[i]=f[i];
  101. }
  102. size[n+1]=1;
  103. m=read();
  104. for (int i=1; i<=m; i++)
  105. {
  106. int com=read();
  107. if (com==1)
  108. {
  109. int x=read();
  110. makeroot(n+1);
  111. access(x+1);splay(x+1);
  112. printf("%d\n",size[son[x+1][0]]);
  113. }
  114. else
  115. {
  116. int x=read(),y=read();
  117. int temp=min(n+1,x+y+1);
  118. cut(x+1,next[x+1]);link(x+1,temp);
  119. next[x+1]=temp;
  120. }
  121. }
  122. return 0;
  123. }

BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)的更多相关文章

  1. [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)

    [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...

  2. BZOJ 2002 弹飞绵羊(分块)

    题目:弹飞绵羊 这道题,据说是lct裸题,但是lct那么高级的数据结构,我并不会,所以采取了学长讲过的分块做法,我们对序列分块,可以定义两个数组,其中一个表示从当前位置跳出当前块需要多少步,另一个数组 ...

  3. [bzoj] 2002 弹飞绵羊 || LCT

    原题 简单的LCT练习题. 我们发现对于一个位置x,他只能跳到位置x+k,也就是唯一的父亲去.加入我们将弹飞的绵羊定义为跳到了n+1,那么这就形成了一棵树.而因为要修改k,所以这颗树是动态连边的,那么 ...

  4. bzoj 2002: 弹飞绵羊 Link-Cut-Tree

    题目: Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...

  5. BZOJ 2002 弹飞绵羊

    LCT 刚学LCT,对LCT的性质不太熟练,还需要多多练习.. 对每一个点,将其与它能够到达的点连一条虚边.弹出去的话就用n+1这个节点表示. 第一种操作我们需要从LCT的性质入手,问的问题其实就是x ...

  6. bzoj 2002 弹飞绵羊 lct裸题

    上一次用分块过了, 今天换了一种lct(link-cut tree)的写法. 学lct之前要先学过splay. lct 简单的来说就是 一颗树, 然后每次起作用的都是其中的某一条链. 所以每次如果需要 ...

  7. bzoj 2002 弹飞绵羊 分块

    正解lct,然而本蒟蒻并不会.... 分块思路很清晰,处理出每个点弹出所在块所需要的步数及出去后的第一个位置 #include<cstdio> #include<cstring> ...

  8. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

    [BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...

  9. P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz

    好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...

  10. P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?

    好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...

随机推荐

  1. 线性代数与MATALB1

    1图论的一个基本应用 下图描述了4个城市之间的航空航线图, 为了描述着4个城市之间航线的邻接关系,定义邻接矩阵 第i行描述从城市i出发,可以达到各个城市的情况, 可以证明,矩阵A^N表示一个人连续坐N ...

  2. 最长回文子串Manacher算法模板

    Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串.其算法的基本原理就是利用已知回文串的左半部分来推导右半部分. 首先,在字符串s中,用rad[i]表示第i个字符 ...

  3. springMVC+ajax分页查询

    项目用到ajax技术的查询,查询结果很多时候要分页展示.这两天摸索了一下,在这里做一总结,方便自己随时查看, 也方便后人参考. 这里的顺序遵从从前台页面到后台控制器,业务层,Dao层,Mapper 下 ...

  4. Windows远程桌面连接Ubuntu 14.04

    由于xrdp.gnome和unity之间的兼容性问题,在Ubuntu 14.04版本中仍然无法使用xrdp登陆gnome或unity的远程桌面,现象是登录后只有黑白点为背景,无图标也无法操作.与13. ...

  5. Apache轻量级性能测试工具

    平时工作中会需要一些性能测试,简单的性能测试完全可以由AB来替代,而不需要动用LR这样重量级的工具. 此文简单介绍一下ab的工具使用与结果分析.当作个笔记,以便以后查阅. 1.安装:要使用AB,需要先 ...

  6. 转: Red Hat/Fedora Linux 上使用 yum 安装 python pip 模块

    from: http://www.cnblogs.com/moinmoin/archive/2012/03/07/red-hat-Fedora-python-pip-install-how.html ...

  7. python基础随笔

    一: 作用域 对于变量的作用域,只要内存中存在,该变量就可以使用. 二:三元运算 name = 值1 if 条件 else 值2 如果条件为真:result = 值1 如果条件为假:result = ...

  8. 使用Windows Live Writer发布日志

    前言 Windows Live Writer是非常不错的一个日志发布工具,支持本地写文章,然后通过点击一个按钮就发布到网站上,如果借助插件,还可以同时发布到多个博客网站,功能非常强大,很多博友认识她之 ...

  9. android的progressDialog 的使用。android数据异步加载 对话框提示

    在调用的Activity中定义一个全局的 progressDialog 点击按钮的时候调用下面这句 progressDialog = ProgressDialog.show(SearchActivit ...

  10. 恢复windows 的快捷方式打开方法,亲测1-7恢复,

    相信有些用户曾试过错误地把LNK文件的打开方式更改其他文件,导致系统所有的快捷方式都失效.在vista与Windows7系统还不普遍使用的时候,相信大家会有点惊慌失措,不要紧,下面只要大家进行如下操作 ...