「HAOI2010」 弹飞绵羊
题目链接
\(Solution\)
\(LCT\)裸题
我们首先先新建一个节\(n+1\)点,表示被弹飞
对于点\(i,link(i,min(n+1,i+k_i))\)
再看看修改:
现在要将点\(x\)修改为\(K,\)则\(:cut(x,min(n+1,x+k_x)),link(x,min(n+1,x+K)),k_x=K\)
最后对于询问,直接\(splix(x,n+1)\)就好了,不多说了.
\(Code\)
#include<bits/stdc++.h>
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node {
int fa,v,lazy,ch[2];
}a[1000010];
stack<int>s;
bool nroot(int x){
return a[a[x].fa].ch[0]==x||a[a[x].fa].ch[1]==x;
}
void pushup(int x){
a[x].v=a[a[x].ch[0]].v+a[a[x].ch[1]].v+1;
}
void work(int x){
swap(a[x].ch[0],a[x].ch[1]),a[x].lazy^=1;
}
void pushdown(int x){
if(a[x].lazy){
if(a[x].ch[0]) work(a[x].ch[0]);
if(a[x].ch[1]) work(a[x].ch[1]);
a[x].lazy=0;
}
}
void rotate(int x){
int y=a[x].fa,z=a[y].fa,k=(a[y].ch[1]==x);
if(nroot(y)) a[z].ch[a[z].ch[1]==y]=x;
a[x].fa=z,a[a[x].ch[k^1]].fa=y;
a[y].ch[k]=a[x].ch[k^1],a[y].fa=x;
a[x].ch[k^1]=y,pushup(x),pushup(y);
}
void splay(int x){
int u=x;
s.push(u);
while(nroot(u)) s.push(u=a[u].fa);
while(!s.empty()) pushdown(s.top()),s.pop();
while(nroot(x)){
int y=a[x].fa,z=a[y].fa;
if(nroot(y))
(a[y].ch[0]==x)^(a[z].ch[0]==y)?rotate(x):rotate(y);
rotate(x);
}
pushup(x);
}
void access(int x){
for(int y=0;x;y=x,x=a[x].fa)
splay(x),a[x].ch[1]=y,pushup(x);
}
void makeroot(int x){
access(x),splay(x),work(x);
}
int findroot(int x){
access(x),splay(x);
while(a[x].ch[0]) pushdown(x),x=a[x].ch[0];
splay(x);
return x;
}
void split(int x,int y){
makeroot(x),access(y),splay(y);
}
void link(int x,int y){
makeroot(x);
if(findroot(y)!=x)
a[x].fa=y;
}
void cut(int x,int y){
makeroot(x);
if(findroot(y)!=x||a[y].fa!=x||a[y].ch[0]) return ;
a[y].fa=a[x].ch[1]=0,pushup(x);
}
int k[1000001];
int main(){
int n=read();
for(int i=1;i<=n;i++)
k[i]=read(),link(i,min(n+1,i+k[i]));
int m=read(),K;
for(int i=1;i<=m;i++){
int opt=read(),x=read()+1;
if(opt==1)
split(x,n+1),printf("%d\n",a[n+1].v-1);
else K=read(),cut(x,min(n+1,x+k[x])),link(x,min(n+1,x+K)),k[x]=K;
}
return 0;
}
「HAOI2010」 弹飞绵羊的更多相关文章
- 「HNOI2010」弹飞绵羊
「HNOI2010」弹飞绵羊 传送门 考虑分块. 每一个位置 \(i\) ,记 \(to[i]\) 表示从这个位置一直往右跳回落在哪个位置. 然后修改的时候直接暴改,查询也是暴跳,复杂度 \(O(n ...
- 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
- P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz
好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...
- P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?
好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree
2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答 ...
- 【BZOJ 2002】【Hnoi 2010】弹飞绵羊 分块||Link Cut Tree 两种方法
ShallWe,Yveh,hmy,DaD3zZ,四人吃冰糕从SLYZ超市出来后在马路上一字排开,,,吃完后发现冰糕棍上写着:“向狮子座表白:愿做你的小绵羊”,,, 好吧在这道题里我们要弹飞绵羊,有分块 ...
- BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
随机推荐
- ubantu的安装和卸载
ubuntu软件安装与卸载 更新Ubuntu软件下载地址 1. 寻找国内镜像源 所谓的镜像源:可以理解为提供下载软件的地方,比如Android手机上可以下载软件的91手机助手:iOS手机上可以下载软件 ...
- CSS控制文字只显示一行 超出部分显示省略号
<p style="width: 120px; height: 50px; border: 1px solid blue; white-space: nowrap; over ...
- Xcode 中设置部分文件ARC支持
ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的 ...
- Struts2 学习记录-1--Struts2中的配置文件
目录 1. web.xml 2. struts.xml 3. struts.properties文件 4.注解式开发 5.与Spring框架集成的配置 主要涉及3个配置文件:web.xml.strut ...
- C# 将Word,Execl,PPT,Project, 文件转成PDF, 不依赖Office!!
git 地址 https://gitee.com/bandung/Execl_WordTOPDF.git 包括了各种破解的dll Word转PDF 挨个引用 Word转PDF public void ...
- sql产生随机数字
第一种:select cast(ceiling(rand() * 10) as int)第二种:select cast(ceiling(rand(checksum(newid()))*10) as i ...
- PHP开启页面报错的代码
PHP开启页面报错的方法很简单,在<?php内加入下面的代码就可以了: <?php ini_set("display_errors", "On"); ...
- SOCKET句柄泄露带来的内存灾难
前些时候游戏莫名其妙出现大量内存泄露,我感到很诧异,当然一般情况下游戏的内存管理是极其严苛的,出现如此大量的内存泄露到底是怎么回事? 句柄滥用导致的内存泄露会多夸张呢,尤其SOCKET,在某些客户端系 ...
- Under-sampling
Under sampling When the signal frequency is high, and the tester frequency can’t catch the signal ...
- clone一行div tr 每次增量赋值
$("#add_tan").click(function () { num++; $("tbody tr.tab_xue").eq(0).clone(true) ...