[HDU1512]Monkey King(左偏树)

本文介绍了一种利用并查集维护猴子间关系的方法,并通过左偏树来高效更新和查询猴子们的强壮值。代码示例展示了如何在猴子间建立关系以及更新强壮值的具体实现。

用并查集维护猴子们的关系,强壮值用左偏树维护就行了

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 100010
using namespace std;

int n,fa[N],m,fr[N];
//fr[x]维护猴子x所在集合在左偏树上的编号 

int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);}
namespace Lt{
	int cnt,l[N],r[N],v[N],d[N];
	inline void Init(){
		cnt=0;
		memset(l,0,sizeof(l)),memset(r,0,sizeof(r));
		memset(v,0,sizeof(v)),memset(d,0,sizeof(d));
	}
	int merge(int x,int y){
		if(!x||!y) return x+y;
		if(v[x]<v[y]) swap(x,y);
		r[x]=merge(r[x],y);
		if(d[r[x]]>d[l[x]]) swap(l[x],r[x]);
		d[x]=d[r[x]]+1;
		return x;
	}
	inline void clear(int x){l[x]=r[x]=d[x]=0;}//记得一定要清零 
}

inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

int main(){
	while(~scanf("%d",&n)){
		Lt::Init();
		for(int i=1;i<=n;++i) Lt::v[i]=read(),fa[i]=fr[i]=i;
		for(m=read();m--;){
			int u=read(),v=read(),px=Find(u),py=Find(v),hhh;
			if(px==py) puts("-1");
			else{
				fa[px]=hhh=py;
				u=fr[px],v=fr[py];
				int t1=Lt::merge(Lt::l[u],Lt::r[u]),t2=Lt::merge(Lt::l[v],Lt::r[v]);
				Lt::clear(u),Lt::v[u]/=2;
				Lt::clear(v),Lt::v[v]/=2;
				t1=Lt::merge(t1,u),t2=Lt::merge(t2,v);
				int x=Lt::merge(t1,t2);
				printf("%d\n",Lt::v[x]);
				fr[hhh]=x;
			}
		}
	}
	return 0;
}

 

 
 
G
M
T
 
检测语言世界语中文简体中文繁体丹麦语乌克兰语乌兹别克语乌尔都语亚美尼亚语伊博语俄语保加利亚语僧伽罗语克罗地亚语冰岛语加利西亚语加泰罗尼亚语匈牙利语南非祖鲁语卡纳达语印地语印尼巽他语印尼爪哇语印尼语古吉拉特语哈萨克语土耳其语塔吉克语塞尔维亚语塞索托语威尔士语孟加拉语宿务语尼泊尔语巴斯克语布尔语(南非荷兰语)希伯来语希腊语德语意大利语意第绪语拉丁语拉脱维亚语挪威语捷克语斯洛伐克语斯洛文尼亚语斯瓦希里语旁遮普语日语格鲁吉亚语毛利语法语波兰语波斯尼亚语波斯语泰卢固语泰米尔语泰语海地克里奥尔语爱尔兰语爱沙尼亚语瑞典语白俄罗斯语立陶宛语索马里语约鲁巴语缅甸语罗马尼亚语老挝语芬兰语苗语英语荷兰语菲律宾语葡萄牙语蒙古语西班牙语豪萨语越南语阿塞拜疆语阿尔巴尼亚语阿拉伯语韩语马其顿语马尔加什语马拉地语马拉雅拉姆语马来语马耳他语高棉语齐切瓦语 世界语中文简体中文繁体丹麦语乌克兰语乌兹别克语乌尔都语亚美尼亚语伊博语俄语保加利亚语僧伽罗语克罗地亚语冰岛语加利西亚语加泰罗尼亚语匈牙利语南非祖鲁语卡纳达语印地语印尼巽他语印尼爪哇语印尼语古吉拉特语哈萨克语土耳其语塔吉克语塞尔维亚语塞索托语威尔士语孟加拉语宿务语尼泊尔语巴斯克语布尔语(南非荷兰语)希伯来语希腊语德语意大利语意第绪语拉丁语拉脱维亚语挪威语捷克语斯洛伐克语斯洛文尼亚语斯瓦希里语旁遮普语日语格鲁吉亚语毛利语法语波兰语波斯尼亚语波斯语泰卢固语泰米尔语泰语海地克里奥尔语爱尔兰语爱沙尼亚语瑞典语白俄罗斯语立陶宛语索马里语约鲁巴语缅甸语罗马尼亚语老挝语芬兰语苗语英语荷兰语菲律宾语葡萄牙语蒙古语西班牙语豪萨语越南语阿塞拜疆语阿尔巴尼亚语阿拉伯语韩语马其顿语马尔加什语马拉地语马拉雅拉姆语马来语马耳他语高棉语齐切瓦语     
 
 
 
文本转语音功能仅限200个字符
 
 选项 : 历史 : 反馈 : Donate关闭

转载于:https://www.cnblogs.com/void-f/p/9168879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值