【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊 LCT

原创 2017年01月03日 17:47:20

感觉LCT实在是太好玩了qwq。。。。。
这里我们首先思考没有改变操作该怎么做?可以把每一个节点和他将要到达的点(作为父亲节点)连边(建立一个虚拟的根节点表示弹飞绵羊),然后我们就得到了一棵树,每一个点需要弹射几次能够被弹飞就是他的深度-1咯(根节点深度为1)。但是如果有修改操作的话,说明树是动态的,LCT解决动态树,不会LCT的去切BZOJ 2049

说一下这里的link和cut操作,首先cut操作,首先我们access(a)这样由于i和fa[i]是相邻的而且fa[a]的深度更小,所以splay(a)以后,fa[a]就是a的左儿子了,切断以后更新一下就好了。

然后是link操作。现在link(a,b) (b是新的a的父亲节点),所以总的根节点一定是在b所在的树内对吧,也就是说是将a连入b,而在a这棵辅助树里,a的深度一定是最小的对吧(刚刚才cut出来的),所以他就是暂时原树的根节点咯,所以直接splay以后fa[a]=b就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 200020
#define ls(u) ch[u][0]
#define rs(u) ch[u][1]
using namespace std;
int n,m,k[maxn],fa[maxn],ch[maxn][2],size[maxn],rt;
inline int Q(int u){return u==rs(fa[u]);}
inline bool isrt(int u){return !fa[u]||(u!=ls(fa[u])&&u!=rs(fa[u]));}
inline void push_up(int u){size[u]=size[ls(u)]+size[rs(u)]+1;}
void rotate(int u){
	if(!u)return;
	int f=fa[u],ff=fa[f],d=!Q(u);
	if(!isrt(f))ch[ff][Q(f)]=u;fa[u]=ff;
	if(ch[u][d])fa[ch[u][d]]=f;ch[f][!d]=ch[u][d];
	ch[u][d]=f;fa[f]=u;
	push_up(f),push_up(u);
} 
void splay(int u){
	if(!u)return;
	while(!isrt(u)){
		int f=fa[u];
		if(!isrt(f)){
			if(Q(u)==Q(f))rotate(f);
			else rotate(u);
		}
		rotate(u);
	}
}
void access(int u){
	for(int x=0;u;u=fa[x=u]){
		splay(u);rs(u)=x;
		push_up(u);
	}
}
void cut(int a){
	access(a),splay(a);
	fa[ls(a)]=0,ls(a)=0;
	push_up(a);
}
void link(int a,int b){
	access(a),splay(a);
	fa[a]=b;
}

int main(){
	scanf("%d",&n);rt=n+1;
	for(int i=1;i<=n;i++){
		scanf("%d",k+i);
		if(i+k[i]<=n)fa[i]=i+k[i];
		else fa[i]=rt;
	}
	scanf("%d",&m);
	int pos,a,b;
	while(m--){
		scanf("%d",&pos);
		if(pos==1){
			scanf("%d",&a);a++;
			access(a),splay(a);
			printf("%d\n",size[ls(a)]);
		}else {
			scanf("%d%d",&a,&b);a++;
			a+b>n?b=rt:b=a+b;
			cut(a),link(a,b);
		}
	}
	return 0;
}


版权声明:你喜欢就好

相关文章推荐

初识lct——洛谷p3203 bzoj2002 [HNOI2010]BOUNCE 弹飞绵羊

题目大意:现在有n个装置,每个装置会弹到一个地方(编号一定在它之后),也可能直接弹了出去,动态修改会弹到的地方,和动态查询从一个装置出发多少次会被弹出去。...

【LCT】BZOJ2002(Hnoi2010)[Bounce 弹飞绵羊]题解

BZOJ2002题解。

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

题目大意:给出一个森林,支持两个操作:修改边,输出点到所在树的根的距离LCT裸题。操作挺少的,只有Link和Cut操作(所以和到一起写了),维护一下Size即可。#include #define N...
  • YihAN_Z
  • YihAN_Z
  • 2016年12月13日 19:34
  • 162

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

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5392  Solved: 2846 [...
  • whai362
  • whai362
  • 2015年08月14日 13:36
  • 501

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

Description某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设...

[LCT]BZOJ 2002——[Hnoi2010]Bounce 弹飞绵羊

2002: [Hnoi2010]Bounce 弹飞绵羊题目描述某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在...
  • CHN_JZ
  • CHN_JZ
  • 2017年07月10日 15:35
  • 626

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT
  • wzq_QwQ
  • wzq_QwQ
  • 2015年08月10日 13:41
  • 1366

BZOJ2002——[Hnoi2010]Bounce 弹飞绵羊

1、题目大意:就是给一个动态的森林求size域 2、分析: 这个就是一个动态树问题,对于每一个位置i有i+ki这个父亲, 于是这就是一个森林了,然后对于每一个修改直接lct维护就好,询问就是i到最外...

【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊

【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊 LCT模板题~

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 10629  Solved: 5476 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊 LCT
举报原因:
原因补充:

(最多只允许输入30个字)