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

解题思路:

LCT,很显然要让 i 与 i 能到的点连边,yy一个不存在的点n+1,让所有点与它连边表示弹飞。

更改时先Cut后Link

最后查询时将n+1与x路径提取,查询重量即可(注意要-1^_^)

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define lll tr[spc].ch[0]
  5. #define rrr tr[spc].ch[1]
  6. #define ls ch[0]
  7. #define rs ch[1]
  8. const int N=;
  9. struct trnt{
  10. int ch[];
  11. int lzt;
  12. int fa;
  13. int wgt;
  14. bool anc;
  15. }tr[N];
  16. int nx[N];
  17. int n,m;
  18. bool whc(int spc)
  19. {
  20. return tr[tr[spc].fa].rs==spc;
  21. }
  22. void pushup(int spc)
  23. {
  24. tr[spc].wgt=tr[lll].wgt+tr[rrr].wgt+;
  25. return ;
  26. }
  27. void trr(int spc)
  28. {
  29. if(!spc)
  30. return ;
  31. std::swap(lll,rrr);
  32. tr[spc].lzt^=;
  33. return ;
  34. }
  35. void pushdown(int spc)
  36. {
  37. if(tr[spc].lzt)
  38. {
  39. tr[spc].lzt=;
  40. trr(lll);
  41. trr(rrr);
  42. }
  43. return ;
  44. }
  45. void recal(int spc)
  46. {
  47. if(!tr[spc].anc)
  48. recal(tr[spc].fa);
  49. pushdown(spc);
  50. return ;
  51. }
  52. void rotate(int spc)
  53. {
  54. int f=tr[spc].fa;
  55. bool k=whc(spc);
  56. tr[f].ch[k]=tr[spc].ch[!k];
  57. tr[spc].ch[!k]=f;
  58. if(tr[f].anc)
  59. {
  60. tr[spc].anc=;
  61. tr[f].anc=;
  62. }else
  63. tr[tr[f].fa].ch[whc(f)]=spc;
  64. tr[spc].fa=tr[f].fa;
  65. tr[f].fa=spc;
  66. tr[tr[f].ch[k]].fa=f;
  67. pushup(f);
  68. pushup(spc);
  69. return ;
  70. }
  71. void splay(int spc)
  72. {
  73. recal(spc);
  74. while(!tr[spc].anc)
  75. {
  76. int ft=tr[spc].fa;
  77. if(tr[ft].anc)
  78. {
  79. rotate(spc);
  80. return ;
  81. }
  82. if(whc(spc)^whc(ft))
  83. rotate(spc);
  84. else
  85. rotate(ft);
  86. rotate(spc);
  87. }
  88. return ;
  89. }
  90. void access(int spc)
  91. {
  92. int lst=;
  93. while(spc)
  94. {
  95. splay(spc);
  96. tr[rrr].anc=;
  97. tr[lst].anc=;
  98. rrr=lst;
  99. pushup(spc);
  100. lst=spc;
  101. spc=tr[spc].fa;
  102. }
  103. return ;
  104. }
  105. void Mtr(int spc)
  106. {
  107. access(spc);
  108. splay(spc);
  109. trr(spc);
  110. return ;
  111. }
  112. void Link(int spc,int y)
  113. {
  114. access(spc);
  115. splay(spc);
  116. tr[spc].fa=y;
  117. return ;
  118. }
  119. void Cut(int x,int y)
  120. {
  121. Mtr(x);
  122. access(y);
  123. splay(x);
  124. tr[x].rs=;
  125. tr[y].anc=;
  126. tr[y].fa=;
  127. return ;
  128. }
  129. void split(int x,int y)
  130. {
  131. Mtr(x);
  132. access(y);
  133. splay(y);
  134. }
  135. int dest(int i)
  136. {
  137. return (i+nx[i]>n)?(n+):(i+nx[i]);
  138. }
  139. int main()
  140. {
  141. scanf("%d",&n);
  142. for(int i=;i<=n+;i++)
  143. tr[i].anc=;
  144. for(int i=;i<=n;i++)
  145. {
  146. scanf("%d",&nx[i]);
  147. Link(i,dest(i));
  148. }
  149. scanf("%d",&m);
  150. while(m--)
  151. {
  152. int i,j,k;
  153. scanf("%d",&i);
  154. if(i==)
  155. {
  156. scanf("%d",&j);
  157. j++;
  158. split(j,n+);
  159. printf("%d\n",tr[n+].wgt-);
  160. }else{
  161. scanf("%d%d",&j,&k);
  162. j++;
  163. Cut(j,dest(j));
  164. nx[j]=k;
  165. Link(j,dest(j));
  166. }
  167. }
  168. return ;
  169. }

BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)的更多相关文章

  1. [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)

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

  2. [BZOJ2002][Hnoi2010]Bounce弹飞绵羊 LCT

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 建图,每次往后面跳就往目标位置连边,将跳出界的点设为同一个点.对于修改操作发现可以用 ...

  3. BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 【LCT】【分块】

    BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始, ...

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

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

  5. [bzoj2002][Hnoi2010]Bounce弹飞绵羊_LCT

    Bounce弹飞绵羊 bzoj-2002 Hnoi-2010 题目大意:n个格子,每一个格子有一个弹簧,第i个格子会将经过的绵羊往后弹k[i]个,达到i+k[i].如果i+k[i]不存在,就表示这只绵 ...

  6. bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

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

  7. [bzoj2002][Hnoi2010]Bounce弹飞绵羊——分块

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

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

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 这一题除了LCT解法,还有一种更巧妙,代码量更少的解法,就是分块.先想,如果仅仅记录每 ...

  9. bzoj2002 [Hnoi2010]Bounce 弹飞绵羊——分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一次用分块,感觉超方便啊: 如果记录每个点的弹力系数,那么是O(1)修改O(n)查询 ...

随机推荐

  1. 识别CentOS和Ubuntu的系统版本

    识别CentOS和Ubuntu的系统版本1.用 lsb-release#!/bin/bashInstall_LSB(){        if [ "$PM" = "yum ...

  2. sass01

    Chrome --流行的浏览器,及前端开发调试工具 WebStorm --强大的跨平台前端集成开发环境 Sublime Text --神器级别的代码编辑器,如vim般强大,而上手难度极低. ----- ...

  3. C++中explicit关键字作用

    explicit是c++中不太常用的一个关键字,其作用是用于修饰构造函数,告诉编译器定义对象时不做隐式转换. 举例说明: include <iostream> include <st ...

  4. RedHat Linux 下安装、测试摄像头

    RedHat Linux 下安装.测试摄像头(全文见附件)     随着视频电话的迅速发展我相信大家一定有过在Windows 下安装摄像头的经历,然而大多数 都不支持Linux .我现以罗技摄像头为例 ...

  5. Ubuntu 16.04 实现有线 无线同时用

    因为工作的原因,经常会用有线网卡连接服务器进行配置,无线网卡上外网. 一.查看当前网关信息 pipci@ubuntu:~$ ip route showdefault via 192.168.2.1 d ...

  6. Bootstrap概览

    摘选自runnoob.com,bootstrap4所有api概览: 一.安装: 弹性盒子(flexbox) Bootstrap 3 与 Bootstrap 4 最大的区别就是 Bootstrap 4 ...

  7. Chrome OS 70 发布:这是安卓的私生子吗?

    谷歌于28日正式宣布推出Chrome OS 70.这个最新的Chrome OS系统在一些设计上具备了更多安卓风味,为配备了触摸屏的Chromebook.平板电脑和二合一设备带来了操作界面改善. 据9t ...

  8. Linux系统中命令提示符解释-Linux中命令格式、分类-bash中的快捷键

    1.命令提示符 [root@mysqlserver01 opt]# [root@mysqlserver01 ~]# root 当前用户名 @ 固定的(格式) mysqlserver01 主机名 opt ...

  9. pip-window安装

    windows 安装: 保证计算机联网直接使用cmd 执行 python -m pip install -U pip 自动安装 找到 python安装的路径 C:\Users\Administrato ...

  10. php https链接

    1.安装soap扩展 2.安装openssL 3.代码执行 function  issure($sn){//通过soap链接接口  进行确认是否是正确的sn码    try{        $clie ...