呃这题的Hint写着splay启发式合并……但是蒟蒻不懂T_T只好写个简单的LCT来蒙混过关,就是时间效率上差劲的很……

不过能够一次AC心情也是蛮愉悦的~

  1. /**************************************************************
  2. Problem: 2002
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:1932 ms
  7. Memory:6156 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 2002
  11. #include<cstdio>
  12. #include<cstdlib>
  13. #include<cstring>
  14. #include<iostream>
  15. #include<algorithm>
  16. #define rep(i,n) for(int i=0;i<n;++i)
  17. #define F(i,j,n) for(int i=j;i<=n;++i)
  18. #define D(i,j,n) for(int i=j;i>=n;--i)
  19. using namespace std;
  20. const int N=;
  21.  
  22. int c[N][],fa[N],size[N],n,m,k[N],st[N],top=;
  23. bool rev[N];
  24.  
  25. int read(){
  26. char ch=getchar();
  27. int sig=,tmp=;
  28. while(ch<''||ch>'') {if (ch=='-') sig=-;ch=getchar();}
  29. while(ch>='' && ch<='') {tmp=*tmp+ch-'';ch=getchar();}
  30. return tmp*sig;
  31. }
  32.  
  33. void Push_down(int x){
  34. if (rev[x]){
  35. rev[x]^=; rev[c[x][]]^=; rev[c[x][]]^=;
  36. swap(c[x][],c[x][]);
  37. }
  38. }
  39. inline void Push_up(int x){
  40. size[x]=size[c[x][]]+size[c[x][]]+;
  41. }
  42. bool isroot(int x){
  43. return c[fa[x]][]!=x && c[fa[x]][]!=x;
  44. }
  45. void rotate(int x){
  46. int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
  47. if (!isroot(y)) c[z][c[z][]==y]=x;
  48. fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
  49. c[y][l]=c[x][r]; c[x][r]=y;
  50. Push_up(y); Push_up(x);
  51. }
  52. void splay(int x){
  53. top=; st[top++]=x;
  54. for(int i=x;!isroot(i);i=fa[i])
  55. st[top++]=fa[i];
  56. while(top--) Push_down(st[top]);
  57.  
  58. while(!isroot(x)){
  59. int y=fa[x],z=fa[y];
  60. if (!isroot(y)){
  61. if (c[y][]==x^c[z][]==y) rotate(x);
  62. else rotate(y);
  63. }
  64. rotate(x);
  65. }
  66. }
  67. void access(int x){
  68. for(int t=;x;t=x,x=fa[x])
  69. splay(x),c[x][]=t,Push_up(x);
  70. }
  71. void makeroot(int x){
  72. access(x); splay(x); rev[x]^=;
  73. }
  74. int find(int x){
  75. access(x); splay(x);
  76. while(c[x][]) x=c[x][];
  77. return x;
  78. }
  79. void cut(int x,int y){
  80. makeroot(x); access(y); splay(y);
  81. if (c[y][]==x) c[y][]=fa[x]=;
  82. }
  83. void link(int x,int y){
  84. makeroot(x); fa[x]=y;
  85. }
  86. //LCT end
  87. int main(){
  88. // freopen("input.txt","r",stdin);
  89. n=read();
  90. F(i,,n){
  91. k[i]=read();
  92. link(i,min(i+k[i],n+));
  93. }
  94. m=read();
  95. int x,y,z;
  96. F(i,,m){
  97. x=read(); y=read(); y++;
  98. if (x==) {
  99. makeroot(n+);
  100. access(y);splay(y);
  101. printf("%d\n",size[y]-);
  102. }
  103. else if(x==){
  104. z=read();
  105. cut(y,min(y+k[y],n+));
  106. k[y]=z;
  107. link(y,min(y+k[y],n+));
  108. }
  109. }
  110. return ;
  111. }

【BZOJ】【2002】【HNOI2010】弹飞绵羊的更多相关文章

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

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

  2. bzoj 2002 Bounce 弹飞绵羊

    bzoj 2002 Bounce 弹飞绵羊 设一个虚拟节点表示被弹飞,则每个点的后继点是唯一确定的,每个点向它的后继点连边,就形成了一颗树. 询问就是问某个节点到虚拟节点的路径长度,修改就删除原来向后 ...

  3. BZOJ 2002 Bounce 弹飞绵羊 (分块或动态树)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 13768  Solved: 6989[Subm ...

  4. BZOJ 2002 Bounce 弹飞绵羊 —— 分块算法

    题目链接:https://vjudge.net/problem/HYSBZ-2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Li ...

  5. bzoj 2002 Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 11202  Solved: 5698[Subm ...

  6. 【bzoj 2002】弹飞绵羊

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

  7. 2002. [HNOI2010]弹飞绵羊【LCT】

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

  8. BZOJ 2002 HNOI2010 弹飞羊 块

    标题效果,LCT解释版本:见 http://blog.csdn.net/popoqqq/article/details/38849471 如今,用一只手滑动块,并再次改写这个问题0.0 块短啊 将进入 ...

  9. BZOJ.2002.Bounce 弹飞绵羊(LCT)

    题目链接 从一个点只能往后跳,即后继状态只有一个,那么拿nxt[x]做fa[x]啊!这样就成了一棵树,从每个点开始的答案是它到所在树的根节点的距离. nxt[]的更改即动态修改树边,用LCT即可. 这 ...

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

    P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...

随机推荐

  1. FileUpload无法赋值解决方案

    FileUpload无法赋值解决方案 编写人:CC阿爸 2015-1-27 今天在这里,我想与大家一起分享如何处理fileupload控件不能赋值的问题.有兴趣的同学,可以一同探讨与学习一下,否则就略 ...

  2. 【积硅计划】http协议基础

    http:超文本传输协议,它允许将超文本标记(html)文档从web服务器传送到浏览器.目前版本HTTP/1.1   http请求过程:   proxy:代理服务器,网络信息的中转站.功能如下:   ...

  3. mysql 修改字段长度

    mysql 修改字段长度 alter table news  modify column title varchar(130); alter table 表名 modify column 字段名 类型 ...

  4. C++实现01串排序

    题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...

  5. ubuntu12.04和deepin12.06使用root账户登录

    修改lightdm.conf登录方式, 1.首先,激活root账户, 在终端中执行 sudo passwd root 连续两次输入 密码,即使root账户的密码,注意密码并不在终端中显示   2. 切 ...

  6. Python学习教程(learning Python)--1.4 Python数据处理基础

    本节主要讨论数据操作及运算符等基础知识,熟悉C语言相关知识的读者请跳过此节. 在高级语言编程过程中,有了数据以后通常要对数据进行相应的数据处理,加.减.乘.除等基本运算,不难理解. 在Python里 ...

  7. node.js web开发:EXPRESS 4.x 以上使用session和cookie 的记录

    关于session 和cookie 我搞了2-3天, 发现这个玩意也挺麻烦的. 很多教程都是把这种会话保存在nosql里面,比如mongo,或者redis等等.但是我还是想直接保存在计算机的内存中,比 ...

  8. C语言如何 实现 下雪效果

    题外话  前言 1.本文主要围绕 如何 在 控制台上 下起 一场 只有自己能看见的雪 2.是个简易跨平台的,主要是C语言 3.动画 采用 1s 40帧, 雪花具有 x轴速度和y轴速度 4.比较简单,可 ...

  9. 苹果内付费 IAP

    创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...

  10. 判断Check复选框是否选中

    <div id="prm_div" style="font-size: 12px;" align="left"> <for ...