【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;
}


版权声明:你喜欢就好

【HNOI 2010】Bounce 弹飞绵羊 分块

BZOJ Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个...
  • Qantun_Mechanics
  • Qantun_Mechanics
  • 2016年09月30日 17:22
  • 1261

bzoj2002 弹飞绵羊

分为sqrt(n)左右块,next[i]记录从i跳出当前块的位置,time[i]记录相应次数,up返回当前点所在块最大值,low返回最小值。提前把low、up存起来似乎更快。。。开始先把next、ti...
  • sdlyyxy
  • sdlyyxy
  • 2015年02月25日 20:18
  • 1037

BZOJ 2001 [Hnoi2010]City 城市建设 LCT+分治(未成功卡时卡过)

BZOJ 2001 [Hnoi2010]City 城市建设 LCT+分治(未成功卡时卡过)
  • wzq_QwQ
  • wzq_QwQ
  • 2015年11月12日 15:51
  • 2261

【bzoj2002】【Hnoi2010】【Bounce 弹飞绵羊】【lct】

题目大意某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数...
  • chunkitlau
  • chunkitlau
  • 2017年05月12日 21:25
  • 83

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

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

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

BZOJ2002题解。
  • zzkksunboy
  • zzkksunboy
  • 2017年05月17日 19:39
  • 678

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

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

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT

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

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
  • 562

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

Description某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设...
  • qq_35649707
  • qq_35649707
  • 2017年04月05日 21:10
  • 87
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊 LCT
举报原因:
原因补充:

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