1、题目大意:就是给一个动态的森林求size域

2、分析: 这个就是一个动态树问题,对于每一个位置i有i+ki这个父亲, 于是这就是一个森林了,然后对于每一个修改直接lct维护就好,询问就是i到最外面的点的个数,恰好是一个链,就求一个
size就好

  1. #include <stack>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. #define LL long long
  8. #define eps 1e-7
  9. int n, m;
  10. struct Node{
  11. Node *ch[2], *fa;
  12. bool rev;
  13. int size;
  14. inline int which();
  15. inline bool reverse(){
  16. if(this) rev ^= 1;
  17. }
  18. inline void pd(){
  19. if(rev){
  20. swap(ch[0], ch[1]);
  21. ch[0] -> reverse();
  22. ch[1] -> reverse();
  23. rev = false;
  24. }
  25. }
  26. inline void maintain(){
  27. size = 1;
  28. size += ch[0] -> size;
  29. size += ch[1] -> size;
  30. }
  31. Node();
  32. } *null = new Node, pos[200010];
  33. Node::Node(){
  34. ch[0] = ch[1] = null;
  35. fa = null;
  36. size = 1;
  37. rev = false;
  38. }
  39. inline int Node::which(){
  40. if(fa == null || (fa -> ch[0] != this && fa -> ch[1] != this)) return -1;
  41. return fa -> ch[1] == this;
  42. }
  43. inline void rotate(Node *o){
  44. Node *p = o -> fa;
  45. int l = o -> which(), r = l ^ 1;
  46. o -> fa = p -> fa;
  47. if(p -> which() != -1) p -> fa -> ch[p -> which()] = o;
  48. p -> ch[l] = o -> ch[r];
  49. if(o -> ch[r]) o -> ch[r] -> fa = p;
  50. o -> ch[r] = p; p -> fa = o;
  51. o -> ch[r] -> maintain();
  52. o -> maintain();
  53. }
  54.  
  55. inline void splay(Node* o){
  56. static stack<Node*> st;
  57. if(!o) return;
  58. Node* p = o;
  59. while(1){
  60. st.push(p);
  61. if(p -> which() == -1) break;
  62. p = p -> fa;
  63. }
  64. while(!st.empty()){
  65. st.top() -> pd(); st.pop();
  66. }
  67.  
  68. while(o -> which() != -1){
  69. p = o -> fa;
  70. if(p -> which() != -1){
  71. if(p -> which() ^ o -> which()) rotate(o);
  72. else rotate(p);
  73. }
  74. rotate(o);
  75. }
  76. }
  77.  
  78. inline void Access(Node* o){
  79. Node* p = null;
  80. while(o != null){
  81. splay(o);
  82. o -> ch[1] = p;
  83. o -> maintain();
  84. p = o; o = o -> fa;
  85. }
  86. }
  87.  
  88. inline void Link(Node* x, Node* y){
  89. Access(x);
  90. splay(x);
  91. if(x -> ch[0]) x -> ch[0] -> fa = null;
  92. x -> ch[0] = null;
  93. x -> fa = y;
  94. x -> maintain();
  95. }
  96.  
  97. int main(){
  98. null->ch[0]=null->ch[1]=null->fa=NULL;
  99. null->size=0;
  100. scanf("%d", &n);
  101. for(int i = 1; i <= n; i ++){
  102. int y; scanf("%d", &y);
  103. if(i + y <= n) pos[i].fa = &pos[i + y];
  104. }
  105. scanf("%d", &m);
  106. while(m --){
  107. int op, x, y;
  108. scanf("%d", &op);
  109. if(op == 1){
  110. scanf("%d", &x); x ++;
  111. Access(&pos[x]);
  112. splay(&pos[x]);
  113. printf("%d\n", pos[x].size);
  114. }
  115. else{
  116. scanf("%d%d", &x, &y); x ++;
  117. if(x + y <= n) Link(&pos[x], &pos[x+y]);
  118. else Link(&pos[x], null);
  119. }
  120. }
  121. return 0;
  122. }

BZOJ2002——[Hnoi2010]Bounce 弹飞绵羊的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 题解【bzoj2002 [Hnoi2010]Bounce 弹飞绵羊】

    Description 给 \(n\) 个点以及它们的弹力系数 \(k_i\) ,含义为 可以弹到 \(i + k_i\) 的位置. 支持两个东西,修改一个点的弹力系数:求一个点要弹多少次弹出 \(n ...

  10. 【lct】bzoj2002 [Hnoi2010]Bounce 弹飞绵羊

    lct板子,此题主要有cut操作和link操作. #include<cstdio> #include<iostream> #include<cstring> #in ...

随机推荐

  1. 真机调试之android手机+chrome

    真机调试之android手机+chrome 虽然chrome上的移动设备模拟器很强大,但是在真机运行的时候,总会遇到一些小问题,这时就需要使用真机调试了. 第一步:准备一台android手机,并在手机 ...

  2. 快捷键&小技巧&备忘录

    shift+鼠标滚轮:实现左右移动 alt+鼠标左键双击:打开属性 chrome中在F12下的Element中,可以先选中某一项,可以直接按住F2进行编辑 chrome中element的右下方我们可以 ...

  3. 机器学习实战------利用logistics回归预测病马死亡率

    大家好久不见,实战部分一直托更,很不好意思.本文实验数据与代码来自机器学习实战这本书,倾删. 一:前期代码准备 1.1数据预处理 还是一样,设置两个数组,前两个作为特征值,后一个作为标签.当然这是简单 ...

  4. docker image重命名

    use docker tag command tag Tag an image into a repository

  5. Jquery 学习之基础一

    1.添加一个CSS类 $("button").click(function(){  $("#div1").addClass("important bl ...

  6. 20145212 《Java程序设计》第8周学习总结

    20145212 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 认识NIO NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你 ...

  7. macbook pro的usb串口失效的的处理方法

    macbook pro的usb串口失效的的处理方法 2011-08-24 12:14:32|  分类: mac|举报|字号 订阅     今天开电脑,无端端一个usb的串口失效了,接入鼠标 iphon ...

  8. Debian 8安装ibus输入法

    # apt-get install ibus ibus-sunpinyin ibus-table-wubi

  9. <Web 之困 现代Web应用安全指南>一本好书 69.00?

    NET代码安全 界面漏洞防范与程序优化 一. SQL 注入攻击的源头 1. 过滤或转移危险字符 2.  使用SqlParameter类:.NET 框架有一个叫做SqlParameter 的集合类型,可 ...

  10. CXF bus interceptor配置

    作用:BUS是cxf的支架,它主要担当扩展及拦截器提供者的角色. 在这里主要讲讲 bus的interceptor的功能 目前配置cxf的interceptor主要有2中方法: 1.通过xml配置文件的 ...