题目传送门

这道题啊 调了一个晚上 因为写的是一个有根树和n个基环的写法 所以写得很奇怪..... 最后发现单独处理树的时候不能随意改变S(就是原来的根)不然size会出错....

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<iostream>
  5. using namespace std;
  6. const int M=;
  7. int read(){
  8. int ans=,f=,c=getchar();
  9. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  10. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  11. return ans*f;
  12. }
  13. int c[M][],fa[M],size[M],rev[M],lx[M],rx[M],sum[M];
  14. int n,m;
  15. bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
  16. void up(int x){size[x]=size[c[x][]]+size[c[x][]]+;}
  17. void down(int x){
  18. int l=c[x][],r=c[x][];
  19. if(rev[x]){
  20. if(l) swap(c[l][],c[l][]),rev[l]^=;
  21. if(r) swap(c[r][],c[r][]),rev[r]^=;
  22. rev[x]=;
  23. }
  24. int u=lx[x],v=rx[x];
  25. if(l) lx[l]=u,rx[l]=v;
  26. if(r) lx[r]=u,rx[r]=v;
  27. }
  28. void rotate(int x){
  29. int y=fa[x],z=fa[y],l=,r=;
  30. if(c[y][]==x) l=,r=;
  31. if(!isrt(y)) c[z][c[z][]==y]=x;
  32. fa[y]=x; fa[x]=z; fa[c[x][r]]=y;
  33. c[y][l]=c[x][r]; c[x][r]=y;
  34. up(y); up(x);
  35. }
  36. int st[M],top=,S;
  37. void splay(int x){
  38. st[++top]=x; for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
  39. while(top) down(st[top--]);
  40. while(!isrt(x)){
  41. int y=fa[x],z=fa[y];
  42. if(!isrt(y)){
  43. if(c[z][]==y^c[y][]==x) rotate(x);
  44. else rotate(y);
  45. }
  46. rotate(x);
  47. }
  48. }
  49. void acs(int x0){
  50. for(int x=x0,y=;x;splay(x),c[x][]=y,up(x),y=x,x=fa[x]);
  51. splay(x0);
  52. }
  53. void mrt(int x){acs(x); swap(c[x][],c[x][]); rev[x]^=;}
  54. int find(int x){
  55. acs(x); while(c[x][]) x=c[x][];
  56. return x;
  57. }
  58. void push_link(int x,int y){mrt(x); fa[x]=y; acs(x);}
  59. void link(int x,int y){
  60. if(find(x)==find(y)) lx[y]=x,rx[y]=y;
  61. else push_link(x,y);
  62. }
  63. int push_ans(int x){
  64. acs(x); if(lx[x]&&rx[x]) return -;
  65. return size[x]-;
  66. }
  67. void cut(int x,int y){mrt(x); acs(y); c[y][]=fa[x]=; up(y); lx[x]=rx[x]=lx[y]=rx[y]=;}
  68. void push_cut(int x,int y){
  69. acs(x); int l=lx[x],r=rx[x];
  70. if(l==x&&r==y) lx[x]=rx[x]=;
  71. else{
  72. cut(x,y);
  73. if(l&&r) link(l,r);
  74. }
  75. }
  76. int main()
  77. {
  78. int k,x,w;
  79. n=read(); m=read(); S=n+;
  80. for(int i=;i<=S;i++) size[i]=;
  81. for(int i=;i<=n;i++){
  82. k=read(); sum[i]=k;
  83. if(i+k<=||i+k>n) push_link(i,S);
  84. else link(i,i+k);
  85. }
  86. for(int i=;i<=m;i++){
  87. k=read();
  88. if(k==) x=read(),mrt(S),printf("%d\n",push_ans(x));
  89. else{
  90. x=read(); w=read();
  91. if(x+sum[x]<=||x+sum[x]>n) cut(x,S);
  92. else push_cut(x,x+sum[x]);
  93. if(x+w<=||x+w>n) push_link(x,S);
  94. else link(x,x+w);
  95. sum[x]=w;
  96. }
  97. }
  98. return ;
  99. }

bzoj4764: 弹飞大爷 link-cut-tree的更多相关文章

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

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

  2. 【LCT维护基环内向树森林】BZOJ4764 弹飞大爷

    4764: 弹飞大爷 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 101  Solved: 52[Submit][Status][Discuss] ...

  3. BZOJ4764弹飞大爷——LCT

    题目描述 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙伴的力量值, ...

  4. bzoj4764: 弹飞大爷

    Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小 ...

  5. bzoj4764 弹飞大爷 LCT

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4764 题解 如果 \(a_i > 0\) 的话,那么就是 bzoj2002 的原题.直接 ...

  6. 【BZOJ4764】弹飞大爷 LCT

    [BZOJ4764]弹飞大爷 Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列 ...

  7. Link Cut Tree 总结

    Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...

  8. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

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

  9. BZOJ 4764: 弹飞大爷

    4764: 弹飞大爷 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 4  Solved: 4[Submit][Status][Discuss] Des ...

随机推荐

  1. Oralce 的sql问题

    获取两个日期间的工作日, SQL> select dt_time  2    from (select to_date('01-12-2010 08:20:56','dd-mm-yyyy HH: ...

  2. 使用LinqToExcel和EPPlus操作excel

    1.使用LinqToExcel LinqToExcel是一个.net framework平台下开源项目,它主要实现了LINQ的语法查询Excel电子表格.类型之前的LINQToXXX如果你是LINQ语 ...

  3. 一些可能有点用处的C#开发经验

    前言: 下个月就要去进行Java开发了,以后C#碰的就少了(可惜去年买了三本C#的书,几乎还是全新的……),平时一些经验都记在OneNote里面,现在收集整理出来,因为只能利用交接工作的打酱油的时间, ...

  4. 汇编指令MOVSX与MOVZX

    MOVSX 操作数A ,操作数B MOVZX 操作数A ,操作数B 相同点:操作数B 空间必须小于 操作数A 1.格式与MOV基本相同 2.能完成小存储单元向大存储单元的数据传送 比如 movsx e ...

  5. zabbix 2.2 调小监控值

    zabbix_agent默认disk下小于0%告警 调小到5% 组态 > 模板 选择需要的模板的触发器 例如 Template OS Windows 选择触发器 - 探索规则 - 触发器类型  ...

  6. @property, @classmethod基本用法

    @property 废话少说,贴上代码(代码参考@廖雪峰教程) class Student(object): def __init__(self, score): self._score = scor ...

  7. 可以完成99%的静态页面的HTML标签

    HTML:一套浏览器认知的规则HTML分为两个部分,头和身体.一个完整的网页相当于一个裸体的人,我们利用HTML给它穿上衣服,使它更好看.下面我将为大家介绍一下HTML一些基本的标签,而这些基本的标签 ...

  8. 以太坊remix IDE安装步骤

    Remix 以太坊Solidity IDE搭建与初步使用 以太坊: 因为以太坊为开源社区,虽然东西很优秀,但是组件十分的杂乱,因此首先简单介绍下以太坊的一些常用组件: Geth: Geth是由以太坊基 ...

  9. Hexo 博客部署到 GitHub

    本文简单记录了一下把 Hexo 部署到 GitHub 上的过程,也是搭建静态博客最常用的一种方式. 前面写了关于如何把 Hexo 安装在树莓派上的教程,但树莓派毕竟是连着自己的家的路由器,万一哪天网断 ...

  10. C++STL——list

    一.相关定义 list 链表,分配的内存不连续 可以高效地进行插入/删除元素 不可随机访问,访问速度慢 特征 只能通过迭代器来访问list中的元素 在头和尾都可以插入元素 二.list [前提条件] ...