[bzoj2002][Hnoi2010]Bounce 弹飞绵羊(LCT)
题目链接
第一次做LCT的题目还有点小激动QAQ
如果将题目所给的关系简化,将弹飞看做是树的根节点,则整个序列就可以看做是一棵树。然后修改操作就是修改一个节点的父节点,查询操作就是查询一个节点的深度。
如果是修改操作,就是先断边再连边,如果是查询操作,就将x与根节点连在一颗splay中,然后查询这颗splay的节点数,这个就是我们维护的siz大小+1。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 3e5 + 10; 5 int fa[maxn], ch[maxn][2], siz[maxn], val[maxn], lazy[maxn], st[maxn];//父亲节点,左右儿子节点,当前子数节点个数,当前值,lazy标记,辅助数组。 6 inline int read() { 7 int x = 0, f = 1; char ch = getchar(); 8 while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); } 9 while (ch >= '0'&&ch <= '9') { x = x * 10 + ch - 48; ch = getchar(); } 10 return x * f; 11 } 12 inline bool isroot(int x) {//判断x是否为所在splay的根 13 return ch[fa[x]][0] != x && ch[fa[x]][1] != x; 14 } 15 inline void pushup(int x) { 16 siz[x] = siz[ch[x][1]] + siz[ch[x][0]] + 1; 17 } 18 inline void pushdown(int x) { 19 if (lazy[x]) { 20 swap(ch[x][0], ch[x][1]); 21 if (ch[x][0])lazy[ch[x][0]] ^= 1; 22 if (ch[x][1])lazy[ch[x][1]] ^= 1; 23 lazy[x] = 0; 24 } 25 } 26 inline void rotate(int x) { 27 int y = fa[x], z = fa[y]; 28 int k = ch[y][1] == x; 29 if (!isroot(y)) 30 ch[z][ch[z][1] == y] = x; 31 fa[x] = z; ch[y][k] = ch[x][k ^ 1]; fa[ch[x][k ^ 1]] = y; 32 ch[x][k ^ 1] = y; fa[y] = x; 33 pushup(y); 34 pushup(x); 35 } 36 inline void splay(int x) { 37 int f = x, len = 0; 38 st[++len] = f; 39 while (!isroot(f))st[++len] = f = fa[f]; 40 while (len)pushdown(st[len--]); 41 while (!isroot(x)) { 42 int y = fa[x]; 43 int z = fa[y]; 44 if (!isroot(y)) 45 rotate((ch[y][0] == x) ^ (ch[z][0] == y) ? x : y); 46 rotate(x); 47 } 48 pushup(x); 49 } 50 inline void access(int x) {//打通根节点到x的实链 51 for (int y = 0; x; x = fa[y = x]) 52 splay(x), ch[x][1] = y, pushup(x); 53 } 54 inline void makeroot(int x) {//将x变为原树的根 55 access(x); splay(x); lazy[x] ^= 1; 56 } 57 int Findroot(int x) {//找根节点 58 access(x), splay(x); 59 while (ch[x][0]) 60 pushdown(x), x = ch[x][0]; 61 splay(x); 62 return x; 63 } 64 inline void split(int x, int y) { makeroot(x); access(y); splay(y); } 65 inline void Link(int x, int y) { makeroot(x); fa[x] = y; } 66 inline void cut(int x, int y) { makeroot(x); access(y); splay(y); fa[x] = ch[y][0] = 0; pushup(y); }//合法断边 67 int main() { 68 int n, m; 69 n = read(); 70 for (int i = 1; i <= n; i++) { 71 val[i] = read(); 72 if (i + val[i] <= n) 73 Link(i, i + val[i]); 74 else 75 Link(i, n + 1); 76 } 77 m = read(); 78 while (m--) { 79 int opt, x, y; 80 opt = read(), x = read() + 1; 81 if (opt == 2) { 82 y = read(); 83 cut(x, x + val[x] <= n ? x + val[x] : n + 1); 84 Link(x, x + y <= n ? x + y : n + 1); 85 val[x] = y; 86 } 87 else { 88 split(x, n + 1); 89 printf("%d\n", siz[n + 1] - 1); 90 } 91 }92 }
转载于:https://www.cnblogs.com/sainsist/p/11414631.html
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊(LCT)相关推荐
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没 ...
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
n<=200000个点,从i会跳到$i+num_i$,保证$num_i>0$,m<=100000个两种操作:一.修改一个$num$:二.问从$i$开始跳多少步跳出这个序列. 大概是L ...
- 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...
- AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 10761 Solved: 5542 [Su ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [HNOI2010]BOUNCE 弹飞绵羊
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
- 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊
https://www.luogu.org/problem/show?pid=3203#sub 这道题第一次TLEl,然后改了改变成AC: 所以说这种题目,时限卡得很紧,一定要思考理论复杂度和常数的问 ...
最新文章
- 激光雷达与汽车技术路线
- 经典C语言程序100例之八四
- WPF DataGrid 在Header中显示行号
- 7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!
- tomee_微服务系列:MicroProfile和Apache TomEE
- 基于javafx的五子棋_JavaFX中基于表达式的PathTransitions
- docker 使用技巧
- c# 后台传到前台乱码_ASP.NET关于前台脚本传递中文参数,后台获取乱码问题(乱码为方框,黑色方框等。。)...
- React-Native开发App,修改图标和名字
- 流水灯程序 keil_天问51学习笔记(3):8个任务的uCOS II程序框架
- 热血江湖辅助代码编写教程(价值500
- AngularJS orderBy 使用要点
- Leetcode799. 香槟塔
- 微信测试公众号如何进行支付测试
- 市场调研-全球与中国安全摄像头芯片市场现状及未来发展趋势
- 半桥llc 增益 matlab程序,“狠”完整的LLC谐振半桥电路分析与计算!
- 如何终止forEach循环
- scrollHeight、clientHeight、offsetHeight、 scrollTop
- jsp035ssm公文流转管理系统(源码)
- 杰理之调节数字音量不起作用以及调节数字音量影响混响效果的解决办法【篇】
热门文章
- 百度编辑器ueditor字体添加
- Spring Framework 4.0相关计划公布---包括对于Java SE 8 和Groovy2的支持
- 范凯:对移动社交型app的一点思考
- R语言金融基础:tidyquant获取数据(标普500与纳斯达克)
- 9、kubernetes之statefulset控制器
- 2018.09.02 bzoj1025: [SCOI2009]游戏(计数dp+线筛预处理)
- “requireJs前传”之为什么要用前端模块化?
- 得到客户端的真实屏幕分辨率
- PDF怎么在线合并为一个文件
- Conflux吐槽君:IOTA物联网电磁炉-让PoW的耗电没有遗憾