题目链接

把每个点和能跳到的点连边,于是就构成了一个森林。

查询操作就是该点到根的路径长度,修改操作就相当于删边再重新连边。

显然是\(LCT\)的强项。

查询时\(access(x),splay(x)\),然后输出\(size[x]\)就行了。

修改时\(access(x),splay(x)\),然后双向断掉\(x\)与左儿子的边,然后直接和\(x+y\)连边即可。

简化版的\(LCT\)

  1. #include <cstdio>
  2. #define R register int
  3. #define I inline void
  4. #define lc c[x][0]
  5. #define rc c[x][1]
  6. const int MAXN = 300010;
  7. inline int read(){
  8. int s = 0, w = 1;
  9. char ch = getchar();
  10. while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
  11. while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
  12. return s * w;
  13. }
  14. int f[MAXN], c[MAXN][2], v[MAXN], s[MAXN], sz[MAXN], st[MAXN], tag[MAXN];
  15. inline int nroot(R x){
  16. return c[f[x]][0] == x || c[f[x]][1] == x;
  17. }
  18. I pushup(R x){
  19. s[x] = s[lc] ^ s[rc] ^ v[x];
  20. sz[x] = sz[lc] + sz[rc] + 1;
  21. }
  22. I swap(R x){
  23. lc ^= rc; rc = lc ^ rc; lc ^= rc; tag[x] ^= 1;
  24. }
  25. I pushdown(R x){
  26. if(tag[x]){
  27. swap(lc); swap(rc);
  28. tag[x] = 0;
  29. }
  30. }
  31. I rotate(R x){
  32. R y = f[x], z = f[y], k = c[y][1] == x, w = c[x][!k];
  33. if(nroot(y)) c[z][c[z][1] == y] = x;
  34. c[x][!k] = y; c[y][k] = w; f[y] = x; f[x] = z;
  35. if(w) f[w] = y;
  36. pushup(y);
  37. }
  38. I splay(R x){
  39. R y = x, z = 0;
  40. st[++z] = y;
  41. while(nroot(y)) st[++z] = y = f[y];
  42. while(z) pushdown(st[z--]);
  43. while(nroot(x)){
  44. y = f[x]; z = f[y];
  45. if(nroot(y)) (c[z][1] == y) ^ (c[y][1] == x) ? rotate(x) : rotate(y);
  46. rotate(x);
  47. }
  48. pushup(x);
  49. }
  50. I access(R x){
  51. for(R y = 0; x; x = f[y = x]){
  52. splay(x); rc = y; pushup(x);
  53. }
  54. }
  55. int n, m, opt, a, b;
  56. int main(){
  57. n = read();
  58. for(R i = 1; i <= n; ++i){
  59. a = read();
  60. if(i + a <= n) f[i] = i + a;
  61. }
  62. m = read();
  63. while(m--){
  64. opt = read(); a = read() + 1;
  65. switch(opt){
  66. case 1 : access(a); splay(a); printf("%d\n", sz[a]); break;
  67. case 2 : b = read(); access(a); splay(a); c[a][0] = f[c[a][0]] = 0; if(a + b <= n) f[a] = a + b; break;
  68. }
  69. }
  70. return 0;
  71. }

【洛谷 P3203】 [HNOI2010]弹飞绵羊(LCT)的更多相关文章

  1. 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]

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

  2. 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  3. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)

    洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...

  4. [洛谷P3203][HNOI2010]弹飞绵羊

    题目大意:有$n$个节点,第$i$个节点有一个弹力系数$k_i$,当到达第$i$个点时,会弹到第$i+k_i$个节点,若没有这个节点($i+k_i>n$)就会被弹飞.有两个操作: $x:$询问从 ...

  5. Bzoj2002/洛谷P3203 [HNOI2010]弹飞绵羊(分块)

    题面 Bzoj 洛谷 题解 大力分块,分块大小\(\sqrt n\),对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是 ...

  6. 洛谷 P3203 [HNOI2010]弹飞绵羊 || bzoj2002

    看来这个lct板子的确没什么问题 好像还可以分块做 #include<cstdio> #include<algorithm> using namespace std; type ...

  7. 洛谷 P3203 [HNOI2010]弹飞绵羊 分块

    我们只需将序列分成 n\sqrt{n}n​ 块,对于每一个点维护一个 val[i]val[i]val[i],to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号.在 ...

  8. 洛谷 P3203 [HNOI2010]弹飞绵羊

    题意简述 有n个点,第i个点有一个ki,表示到达i这个点后可以到i + ki这个点 支持修改ki和询问一点走几次能走出所有点两个操作 题解思路 分块, 对于每个点,维护它走到下一块所经过的点数,它走到 ...

  9. [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)

    题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ...

  10. P3203 [HNOI2010]弹飞绵羊(LCT)

    弹飞绵羊 题目传送门 解题思路 LCT. 将每个节点的权值设为\(1\),连接\(i\)和\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\).从\(j\)弹飞需要的次数就是\(sp ...

随机推荐

  1. 基于图形学混色问题OpenGl的收获

    void myDisplay(void) {glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_B ...

  2. php框架中常用的设计模式

    1.单例模式 //单例模式 class Demo { private static $obj; private function __construct() { } private function ...

  3. webgl 背面剔除

  4. MySQL---InnoDB引擎隔离级别详解

    原帖:http://www.cnblogs.com/snsdzjlz320/p/5761387.html SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不 ...

  5. android面试(5)---SQL数据库

    SQL基础: 1.如何查询table1从20到30条记录: select * from table1 limit 19,11 2.替换id=1,name =deman的记录? replace into ...

  6. Java虚拟机的内存管理----垃圾收集器

    1.Serial收集器 优点,是简单而高效,单线程避免了线程交互的开销. 缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程). 2.ParNew收集器 它是Serial收集器的多 ...

  7. PL/SQL中复制粘贴表结构信息

    1.打开下图中的Tables文件夹 2.查找要找的表 3.右键单击找到的表—>Describe 4.复制所需的数据到EXCEL表中

  8. poll() 与 select()比较

    比较poll() 与select() 尽管poll()和select()所做的是相同的工作,不过poll()优于select(),原因:    1.poll()不需要用户计算并传递作为参数的最高编号的 ...

  9. bzoj2969 矩形粉刷 概率期望

    此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...

  10. Visual Format Language(VFL)视图约束

    约束(Constraint)在IOS编程中非常重要,这关乎到用户的直接体验问题. IOS中视图约束有几种方式,常见的是在IB中通过Pin的方式手动添加约束,菜单Editor->Pin->. ...