「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发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
随机推荐
- echarts x轴文字显示不全(解决方案)
echarts x轴标签文字过多导致显示不全 如图: 解决办法1:xAxis.axisLabel 属性 axisLabel的类型是object ,主要作用是:坐标轴刻度标签的相关设置.(当然yAxis ...
- JS: 如何计算一个月有多少天
转自:https://www.2cto.com/kf/201806/755776.html 1 function getCountDays() { var curDate = new Date(); ...
- vlc相关命令行设置
1:改变VLC模块参数 http://tianxiaoma.blog.51cto.com/1501174/309519 ====================================== ...
- 大楼轮廓 · building-outline
[抄题]: 水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度.大楼之间从远处看可能会重叠,求出 N ...
- C#重启IIS
using System.Diagnostics; using System.ServiceProcess; //ServiceController sc1 = new ServiceControll ...
- php从数组中取出一段 之 array_slice
array array_slice ( array $array , int $offset [, int $length [, bool $preserve_keys ]] ) array_slic ...
- max文件属性设置,
之前一直都没找到 用到的时候就是用net 弄了.哎.还在开发东西都是在9上面, 这次脚本必须在 max8 上面 逼的我找到了他 getFileAttribute <filename_string ...
- 475. Heaters
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- SVN下的文件被locked不能update和commit
一次早上开机svn更新代码,提示某一个文件夹被locked,提示clean up,但是clearn up也不行,get lock不行,release lock不行 根据网上搜的,.svn(隐藏文件夹) ...
- 5 Django-2 的路由层 (URLconf)
URL 配置 (URLconf) 就像 Django 所支撑网站的目录.它的本质是 URL 与要为该 URL 调用的视图函数之间的映射表:你就是以这种方式告诉 Django,对于客户端发来的某个 UR ...