原题

简单的LCT练习题。

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

至于询问,我们把n+1变成根,然后access(x)将x到n+1的路径变为实路径,splay(x),因为每次是向父亲弹,所以sze[ls[x]]即为答案。

//想知道为什么不是sze[x]-1

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define N 200010
  4. #define which(u) (ls[fa[(u)]]==(u))
  5. #define isroot(u) (!fa[(u)] || (ls[fa[(u)]]!=(u) && rs[fa[u]]!=(u)))
  6. using namespace std;
  7. int n,m,fa[N],ls[N],rs[N],a[N],sze[N];
  8. bool rev[N];
  9. char s[20];
  10. void update(int x)
  11. {
  12. sze[x]=1;
  13. if (ls[x]) sze[x]+=sze[ls[x]];
  14. if (rs[x]) sze[x]+=sze[rs[x]];
  15. }
  16. void rotate(int u)
  17. {
  18. int v=fa[u],w=fa[v],b=which(u)?rs[u]:ls[u];
  19. if (!isroot(v)) (which(v)?ls[w]:rs[w])=u;
  20. which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
  21. fa[u]=w,fa[v]=u;
  22. if (b) fa[b]=v;
  23. if (v) update(v);
  24. if (u) update(u);
  25. }
  26. void pushdown(int u)
  27. {
  28. if (!rev[u]) return ;
  29. rev[ls[u]]^=1;
  30. rev[rs[u]]^=1;
  31. swap(ls[u],rs[u]);
  32. rev[u]=0;
  33. }
  34. void splay(int u)
  35. {
  36. static int stk[N],top;
  37. stk[top=1]=u;
  38. while (!isroot(stk[top])) stk[top+1]=fa[stk[top]],top++;
  39. while (top) pushdown(stk[top--]);
  40. while (!isroot(u))
  41. {
  42. if (!isroot(fa[u]))
  43. {
  44. if (which(u)==which(fa[u])) rotate(fa[u]);
  45. else rotate(u);
  46. }
  47. rotate(u);
  48. }
  49. }
  50. void access(int u)
  51. {
  52. int v=0;
  53. while (u)
  54. {
  55. splay(u);
  56. rs[u]=v;
  57. v=u;
  58. u=fa[u];
  59. }
  60. }
  61. void makeroot(int u)
  62. {
  63. access(u);
  64. splay(u);
  65. rev[u]^=1;
  66. }
  67. void link(int u,int v)
  68. {
  69. makeroot(v);
  70. fa[v]=u;
  71. }
  72. void cut(int u,int v)
  73. {
  74. makeroot(u);
  75. access(v);
  76. splay(v);
  77. ls[v]=fa[u]=0;
  78. }
  79. int query(int x)
  80. {
  81. makeroot(n+1);
  82. access(x);
  83. splay(x);
  84. return sze[ls[x]];
  85. }
  86. int main()
  87. {
  88. scanf("%d",&n);
  89. for (int i=1,x;i<=n;i++)
  90. {
  91. scanf("%d",&x);
  92. a[i]=(i+x<=n)?i+x:n+1;
  93. fa[i]=a[i];
  94. sze[i]=1;
  95. }
  96. sze[n+1]=1;
  97. scanf("%d",&m);
  98. while (m--)
  99. {
  100. int op,x,y;
  101. scanf("%d%d",&op,&x);
  102. ++x;
  103. if (op==1)
  104. printf("%d\n",query(x));
  105. else
  106. {
  107. scanf("%d",&y);
  108. cut(x,a[x]);
  109. a[x]=(x+y<=n)?x+y:n+1;
  110. link(x,a[x]);
  111. }
  112. }
  113. return 0;
  114. }

[bzoj] 2002 弹飞绵羊 || LCT的更多相关文章

  1. bzoj 2002 弹飞绵羊 lct裸题

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

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

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

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

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

  4. bzoj 2002 弹飞绵羊 分块

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

  5. BZOJ 2002 弹飞绵羊

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

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

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

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

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

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

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

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

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

随机推荐

  1. Linux工作环境搭建

    云主机工作环境搭建 网易云主机 需要申请弹性公网IP,不然需要OpenVPN才可以链接. 低于50块钱时,不能进行云主机创建. 更新yum源 cd /etc/yum.repos.d/ mkdir re ...

  2. 获取项目中.txt 文件的内容

    package com.fh.controller.ruitai.util; import java.io.BufferedInputStream; import java.io.File; impo ...

  3. hdu2094产生冠军(思维题)

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. SQL注入篇二------利用burp盲注,post注入,http头注入,利用burpsuit找注入点,宽字节注入

    1.布尔盲注burpsuit的使用 先自己构造好注入语句,利用burpsuit抓包,设置变量,查出想要的信息. 比如----查数据库名的ascii码得到数据库构造好语句 http://123.206. ...

  5. Selenium(Python)生成Html测试报告

    由于Python3已经不支持HTMLTestRunner了, 无论是PyCharm还是pip都无法安装成功, 所以只能去 http://tungwaiyip.info/software/HTMLTes ...

  6. 关于@media不生效的问题和meta总结

    1:之前做的是两套页面.现在改成响应式布局.发现加上 @media only screen and (max-width: 500px) {    .gridmenu {        width:1 ...

  7. Centos7下安装mysql服务

    yum install -y perl-Module-Install.noarch yum -y install perl perl-devel #命令下载mysql wget http://dev. ...

  8. 关于wcf服务编译平台是x86, 运行平台是x64时,如何调试

    关于调试CTDC项目中的的 wcf服务时注意事项: 因为wcf项目引用的的 x86的程序集,所以wcf生成的目标平台为x86.故在64系统上调试需要执行下面的脚本 具体操作步骤: 1. 必须使用201 ...

  9. HDU 3264/POJ 3831 Open-air shopping malls(计算几何+二分)(2009 Asia Ningbo Regional)

    Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...

  10. 第一章 Windows编程基础(1~4课)

    第一课:从main到WinMain 第二课:窗口和消息 第三课:MFC编程 第四课:MFC应用程序框架 概括: Win32的两种编程框架:SDK方式.MFC方式 1. SDK方式:使用WinMain入 ...