http://www.lydsy.com/JudgeOnline/problem.php?id=2002

https://www.luogu.org/problemnew/show/P3203

某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

因为它的标签有LCT所以应该是用LCT写的。

因为每个弹射器之间不可能存在环(因为你只能往后跳)所以弹射器和弹飞点(记为n+1)构成了一片森林。

这样我们先link(i,min(i+k[i],n+1)。

对于修改操作显然先cut原先的边在按上面方法link即可。

对于查询我们就是相当于求n+1和i的路径长,先makeroot(n+1),再access(i),这样n+1到i的实边长度即为所求,然后求实链所代表的平衡树大小-1即可。

(下面为吐槽)

说实话最开始没想到LCT怎么求两点最短路。

但是后来一想这不就是access一下之后求实边长度吗。

再看了洛谷超易懂题解发现实链不就是一棵平衡树吗,求一遍平衡树大小-1不就得了?

(假装这题很简单)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N=2e5+10;
int n,m,r,k[N],fa[N],tr[N][2],rev[N],q[N],size[N];
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool get(int x){return tr[fa[x]][1]==x;
}
inline bool isroot(int x){if(!fa[x])return 1;return tr[fa[x]][0]!=x&&tr[fa[x]][1]!=x;
}
inline void upt(int x){size[x]=1;if(tr[x][0])size[x]+=size[tr[x][0]];if(tr[x][1])size[x]+=size[tr[x][1]];
}
inline void pushrev(int x){if(!rev[x])return;swap(tr[x][0],tr[x][1]);if(tr[x][0])rev[tr[x][0]]^=1;if(tr[x][1])rev[tr[x][1]]^=1;rev[x]=0;
}
inline void rotate(int x){int y=fa[x],z=fa[y],b=tr[y][0]==x?tr[x][1]:tr[x][0];if(z&&!isroot(y))(tr[z][0]==y?tr[z][0]:tr[z][1])=x;fa[x]=z;fa[y]=x;b?fa[b]=y:0;if(tr[y][0]==x)tr[x][1]=y,tr[y][0]=b;else tr[x][0]=y,tr[y][1]=b;upt(y);upt(x);
}
inline void splay(int x){q[r=0]=x;for(int y=x;!isroot(y);y=fa[y])q[++r]=fa[y];for(int i=r;i>=0;i--)pushrev(q[i]);while(!isroot(x)){if(!isroot(fa[x]))rotate((get(x)==get(fa[x])?fa[x]:x));rotate(x);}upt(x);
}
inline void access(int x){for(int y=0;x;y=x,x=fa[x]){splay(x);tr[x][1]=y;if(y)fa[y]=x;}
}
inline int findroot(int x){access(x);splay(x);while(pushrev(x),tr[x][0])x=tr[x][0];splay(x);return x;
}
inline void makeroot(int x){access(x);splay(x);rev[x]^=1;
}
inline void link(int x,int y){makeroot(x);fa[x]=y;
}
inline void cut(int x,int y){makeroot(x);access(y);splay(y);tr[y][0]=0;fa[x]=0;
}
int main(){n=read();for(int i=1;i<=n;i++)link(i,min(i+(k[i]=read()),n+1));m=read();for(int i=1;i<=m;i++){int op=read(),j=read()+1;if(op==1){makeroot(j);access(n+1);splay(n+1);printf("%d\n",size[n+1]-1);}else{cut(j,min(j+k[j],n+1));link(j,min(j+(k[j]=read()),n+1));}}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8469602.html

BZOJ2002:[HNOI2010]弹飞绵羊——题解相关推荐

  1. BZOJ2002 [HNOI2010] 弹飞绵羊

    LCT access完了一定splay再用!!! 悲伤= = LCT裸题 把调出去设虚点n+1即可 //Love and Freedom. #include<cstdio> #includ ...

  2. P3203 [HNOI2010]弹飞绵羊

    P3203 [HNOI2010]弹飞绵羊 题目描述 详见:P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题. 但是我并不想用LCT解决此题(In fact 是不会LCT ...

  3. HNOI2010——弹飞绵羊(lct)

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

  4. [HNOI2010]弹飞绵羊

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

  5. luogu P3203 [HNOI2010]弹飞绵羊(LCT ? 暴力分块 ! )

    整理的算法模板合集: ACM模板 已知:暴力 + 暴力 + 10510^5105 = 分块 设 need[i] 表示从 i 开始,跳出所在块的步数:ver[i] 表示跳出当前所在的块后到了哪里: 罗老 ...

  6. BZOJ 2002 HNOI2010 弹飞绵羊 分块

    题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471 今天手滑用分块又重写了一遍这道题0.0 分块就是短啊 将弹簧分 ...

  7. 【codevs2333】【BZOJ2002】弹飞绵羊,第一次的LCT

    传送门1 传送门2 写在前面:开始种树 思路:分块 or LCT,主要结合了黄学长的模版,同时感谢char哥.Yveh.Shallwe的帮助,做法什么的建议大家还是去网上找,有很多神犇讲解得不错,蒟蒻 ...

  8. 【动态树】[BZOJ2002] Bounce 弹飞绵羊

    实际上就是动态树的模版加上一个维护每一条链的size这样就可以吧一次弹射看成一条路径,然后统计这个路径上的size实际上就是经过了多少个节点然后没什么了.. #include <bits/std ...

  9. BZOJ P2002 [HNOI2010] 弹飞绵羊【分块】

    这道题就很优秀了.考试的时候完全没想到正解,最后写了一个暴力20分- 直接讲分块吧.我们预处理两个数组 S t e p [ ] , G e t [ ] Step[],Get[] Step[],Get[ ...

  10. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

    [HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

最新文章

  1. 利用MOG2背景模型提取运动目标的OpenCV代码
  2. linux下实现作业调度程序,Linux后台作业
  3. 关于word插入特殊符号不显示的问题及解决
  4. 32岁被裁,拿N+1,我高兴地失业了
  5. linux链接时区分动态库,Linux修改时区的方法
  6. C++继承中构造和析构顺序
  7. 51nod 1448 二染色问题 (逆向考虑)
  8. JavaWeb基础—项目名的写法
  9. ElasticSearch wildcard查询(英文检索)
  10. 感知机算法python实现
  11. android sqlite assets,使用GreenDao加载assets下sqlite数据库的示例
  12. Mac 10.12安装迅雷2.7.2
  13. python+selenium实现QQ空间的登录
  14. python操作cad的模块_Process Autocad by python
  15. 学习 Java全栈工程师6.0 初学者笔记3— 流程控制 2021-08-11
  16. 三角形的几何公式大全_初中数学几何公式、定理梳理大全,老师都收藏了
  17. 计算机桌面图标如何变小,电脑屏幕图标怎么变小_桌面图标太大怎么调小
  18. 攻防演练中防守方的骚姿势
  19. 不交智商税,如何判断一场知乎live的质量?
  20. 阿里云企业版云服务器使用流程

热门文章

  1. [Deep Learning] 神经网络基础
  2. LeetCode OJ:Linked List Cycle(链表循环)
  3. 一些常用的正则表达式收集
  4. WPF ICommandSource Implementations Leak Memory!
  5. 数据库查询前十名和当前信息的排名信息
  6. awstats的简单配置
  7. 理解GetHashCode()的缺陷
  8. 系统集成项目管理工程师目录
  9. How Google Tests Software (出书,停止更新)
  10. 加快 DHTML 的一组技巧