BZOJ_2002_弹飞绵羊_(LCT)

描述



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

一列n个数,a[i]表示向后a[i]个,问第k个数进行多少次向后跳跃会飞出去.

分析



i连向i+a[i],那么我们建立一个森林,i是i+a[i]的一个子节点,如果i+a[i]>n,那么i连向null.这样对于节点k,问多少次飞出去,就是向上走多少个到null,也就是深度是多少,直接LCt处理.

注意:

1.这里的link并不以LCT中普遍的link.普通的link是将两个不想连的点连在一起,这样两棵树也就连在了一起.这里的link其实是改变父亲节点的意思.

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn=200000+5;
 5 int n,m;
 6
 7 struct node{
 8     node* ch[2],* pa;
 9     int s;
10     node(node* t){ s=1; ch[0]=ch[1]=pa=t; }
11     bool d(){ return pa->ch[1]==this; }
12     bool c(){ return pa->ch[0]==this||pa->ch[1]==this; }
13     void setc(node* x,bool d){ ch[d]=x; x->pa=this; }
14     void push_up(){ s=ch[0]->s+ch[1]->s+1; }
15 }* null,* t[maxn];
16 void rot(node* x){
17     node* pa=x->pa; bool d=x->d();
18     if(pa->c()) pa->pa->setc(x,pa->d());
19     else x->pa=pa->pa;
20     pa->setc(x->ch[!d],d);
21     x->setc(pa,!d);
22     pa->push_up();
23 }
24 void splay(node* x){
25     while(x->c())
26         if(!x->pa->c()) rot(x);
27         else x->d()==x->pa->d()?(rot(x->pa),rot(x)):(rot(x),rot(x));
28     x->push_up();
29 }
30 void access(node* x){
31     node* t=x;
32     for(node* y=null;x!=null;y=x, x=x->pa){
33         splay(x);
34         x->ch[1]=y;
35     }
36     splay(t);
37 }
38 void link(node* x,node* y){
39     access(x);
40     x->ch[0]->pa=null; x->ch[0]=null; x->pa=y; x->push_up();
41 }
42 int main(){
43     null=new node(NULL); null->s=0;
44     scanf("%d",&n);
45     for(int i=0;i<n;i++) t[i]=new node(null);
46     for(int i=0;i<n;i++){
47         int k; scanf("%d",&k);
48         if(i+k<n) t[i]->pa=t[i+k];
49     }
50     scanf("%d",&m);
51     for(int i=1;i<=m;i++){
52         int q,x,y;
53         scanf("%d%d",&q,&x);
54         if(q==1){
55             access(t[x]);
56             printf("%d\n",t[x]->s);
57         }
58         else{
59             scanf("%d",&y);
60             if(x+y<n) link(t[x],t[x+y]);
61             else link(t[x],null);
62         }
63     }
64     return 0;
65 }

时间: 2024-12-27 10:06:25

BZOJ_2002_弹飞绵羊_(LCT)的相关文章

【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

(BZOJ挂了,还没在BZOJ测,先是在wikioi测过了,,) 囧.在军训时立志要学lct!!!这是一道lct的裸题,只有access操作(10行都没有啊亲...缩行大法的话,我就不说了..)(link操作相当于水过),其实lct很简单..想想都有点小激动...... lct用splay维护的话,一下就写好了..但是我在写lct的时候,发现了一些我原来splay的老问题,我原来也知道了的,就是将null的ch给赋值了,因为在rot操作里没有特判,所以导致了null的孩子被赋值了,导致我的lct

bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 15763  Solved: 8080[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

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

Hnoi2010弹飞绵羊题解LCT

题目大意 给定一个序列,每个点有一个权值a[i],一只绵羊若站在点i上会被弹到第i+a[i]个点上,支持单点修改操作,求从某个点出发经过多少次会被弹飞. 题解 令每个点的父亲结点是会被弹到的结点,那询问时每个点的答案就是这个点的深度. LCT维护size域即可 一开始以为是有向树,后来发现自己犯2了,按无向的做法就可以. 做这种题千万别手残.我因为一句x->rever()打成x->rev^=1,就有了如下结果,调了快一整天了! Code #include <cstdio> #inc

洛谷P3203 [HNOI2010]弹飞绵羊【LCT】

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

bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没啥好说的,反正就是LCT,就当存一份模版好了. #include <cstdio> const int maxn = 200005; int n, m, t1, t2, t3, ori_tree_fa[maxn]; int left[maxn], right[maxn], fa[maxn], si

[luoguP3203][HNOI2010]BOUNCE 弹飞绵羊(LCT)

传送门 每个点都会跳到另一个点,连边就是一棵树. 更改弹力就是换边. 求一个点跳多少次跳到终点就是求这个点的深度,那么只需要维护 size 域,access(n + 1) 然后 splay(x),求 size[son[x][0]] 即可, 因为 splay 是以深度为关键字的,所以左端点就是深度比它小的. ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 200010 4 #define min(x, y) ((x

BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊( LCT )

LCT... ---------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #define clr( x , c ) memset( x

bzoj2002 弹飞绵羊 LCT

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 6706  Solved: 3522[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki