BZOJ2002——[Hnoi2010]Bounce 弹飞绵羊
1、题目大意:就是给一个动态的森林求size域
2、分析: 这个就是一个动态树问题,对于每一个位置i有i+ki这个父亲, 于是这就是一个森林了,然后对于每一个修改直接lct维护就好,询问就是i到最外面的点的个数,恰好是一个链,就求一个
size就好
- #include <stack>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define LL long long
- #define eps 1e-7
- int n, m;
- struct Node{
- Node *ch[2], *fa;
- bool rev;
- int size;
- inline int which();
- inline bool reverse(){
- if(this) rev ^= 1;
- }
- inline void pd(){
- if(rev){
- swap(ch[0], ch[1]);
- ch[0] -> reverse();
- ch[1] -> reverse();
- rev = false;
- }
- }
- inline void maintain(){
- size = 1;
- size += ch[0] -> size;
- size += ch[1] -> size;
- }
- Node();
- } *null = new Node, pos[200010];
- Node::Node(){
- ch[0] = ch[1] = null;
- fa = null;
- size = 1;
- rev = false;
- }
- inline int Node::which(){
- if(fa == null || (fa -> ch[0] != this && fa -> ch[1] != this)) return -1;
- return fa -> ch[1] == this;
- }
- inline void rotate(Node *o){
- Node *p = o -> fa;
- int l = o -> which(), r = l ^ 1;
- o -> fa = p -> fa;
- if(p -> which() != -1) p -> fa -> ch[p -> which()] = o;
- p -> ch[l] = o -> ch[r];
- if(o -> ch[r]) o -> ch[r] -> fa = p;
- o -> ch[r] = p; p -> fa = o;
- o -> ch[r] -> maintain();
- o -> maintain();
- }
- inline void splay(Node* o){
- static stack<Node*> st;
- if(!o) return;
- Node* p = o;
- while(1){
- st.push(p);
- if(p -> which() == -1) break;
- p = p -> fa;
- }
- while(!st.empty()){
- st.top() -> pd(); st.pop();
- }
- while(o -> which() != -1){
- p = o -> fa;
- if(p -> which() != -1){
- if(p -> which() ^ o -> which()) rotate(o);
- else rotate(p);
- }
- rotate(o);
- }
- }
- inline void Access(Node* o){
- Node* p = null;
- while(o != null){
- splay(o);
- o -> ch[1] = p;
- o -> maintain();
- p = o; o = o -> fa;
- }
- }
- inline void Link(Node* x, Node* y){
- Access(x);
- splay(x);
- if(x -> ch[0]) x -> ch[0] -> fa = null;
- x -> ch[0] = null;
- x -> fa = y;
- x -> maintain();
- }
- int main(){
- null->ch[0]=null->ch[1]=null->fa=NULL;
- null->size=0;
- scanf("%d", &n);
- for(int i = 1; i <= n; i ++){
- int y; scanf("%d", &y);
- if(i + y <= n) pos[i].fa = &pos[i + y];
- }
- scanf("%d", &m);
- while(m --){
- int op, x, y;
- scanf("%d", &op);
- if(op == 1){
- scanf("%d", &x); x ++;
- Access(&pos[x]);
- splay(&pos[x]);
- printf("%d\n", pos[x].size);
- }
- else{
- scanf("%d%d", &x, &y); x ++;
- if(x + y <= n) Link(&pos[x], &pos[x+y]);
- else Link(&pos[x], null);
- }
- }
- return 0;
- }
BZOJ2002——[Hnoi2010]Bounce 弹飞绵羊的更多相关文章
- BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 【LCT】【分块】
BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始, ...
- [bzoj2002][Hnoi2010]Bounce弹飞绵羊_LCT
Bounce弹飞绵羊 bzoj-2002 Hnoi-2010 题目大意:n个格子,每一个格子有一个弹簧,第i个格子会将经过的绵羊往后弹k[i]个,达到i+k[i].如果i+k[i]不存在,就表示这只绵 ...
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [bzoj2002][Hnoi2010]Bounce弹飞绵羊——分块
Brief description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装 ...
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊——分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一次用分块,感觉超方便啊: 如果记录每个点的弹力系数,那么是O(1)修改O(n)查询 ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 这一题除了LCT解法,还有一种更巧妙,代码量更少的解法,就是分块.先想,如果仅仅记录每 ...
- 题解【bzoj2002 [Hnoi2010]Bounce 弹飞绵羊】
Description 给 \(n\) 个点以及它们的弹力系数 \(k_i\) ,含义为 可以弹到 \(i + k_i\) 的位置. 支持两个东西,修改一个点的弹力系数:求一个点要弹多少次弹出 \(n ...
- 【lct】bzoj2002 [Hnoi2010]Bounce 弹飞绵羊
lct板子,此题主要有cut操作和link操作. #include<cstdio> #include<iostream> #include<cstring> #in ...
随机推荐
- 真机调试之android手机+chrome
真机调试之android手机+chrome 虽然chrome上的移动设备模拟器很强大,但是在真机运行的时候,总会遇到一些小问题,这时就需要使用真机调试了. 第一步:准备一台android手机,并在手机 ...
- 快捷键&小技巧&备忘录
shift+鼠标滚轮:实现左右移动 alt+鼠标左键双击:打开属性 chrome中在F12下的Element中,可以先选中某一项,可以直接按住F2进行编辑 chrome中element的右下方我们可以 ...
- 机器学习实战------利用logistics回归预测病马死亡率
大家好久不见,实战部分一直托更,很不好意思.本文实验数据与代码来自机器学习实战这本书,倾删. 一:前期代码准备 1.1数据预处理 还是一样,设置两个数组,前两个作为特征值,后一个作为标签.当然这是简单 ...
- docker image重命名
use docker tag command tag Tag an image into a repository
- Jquery 学习之基础一
1.添加一个CSS类 $("button").click(function(){ $("#div1").addClass("important bl ...
- 20145212 《Java程序设计》第8周学习总结
20145212 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 认识NIO NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你 ...
- macbook pro的usb串口失效的的处理方法
macbook pro的usb串口失效的的处理方法 2011-08-24 12:14:32| 分类: mac|举报|字号 订阅 今天开电脑,无端端一个usb的串口失效了,接入鼠标 iphon ...
- Debian 8安装ibus输入法
# apt-get install ibus ibus-sunpinyin ibus-table-wubi
- <Web 之困 现代Web应用安全指南>一本好书 69.00?
NET代码安全 界面漏洞防范与程序优化 一. SQL 注入攻击的源头 1. 过滤或转移危险字符 2. 使用SqlParameter类:.NET 框架有一个叫做SqlParameter 的集合类型,可 ...
- CXF bus interceptor配置
作用:BUS是cxf的支架,它主要担当扩展及拦截器提供者的角色. 在这里主要讲讲 bus的interceptor的功能 目前配置cxf的interceptor主要有2中方法: 1.通过xml配置文件的 ...