hdu 1512 Monkey King 左偏树
这题意思是一群一开始互不认识的猴子,可能会打架,打过一场就是朋友,一开始互不相识的猴子打架的时候,不一定自己动手,回去找自己朋友中战斗力最强的猴子,然后,两个打手打架,当然,如果自己最NB时,自己上,但是,打完之后,两只参战的猴子战斗力减半,但是,两方会成为朋友。说了这么多废话,就是建立一堆大顶堆,并且实现堆与堆的合并,利用左偏树是可并堆的特点,进行模拟即可,如果两方在一个朋友圈里,输出“-1”。

/* Memory: 2184 KB Time: 406 MS Language: C++ Result: Accepted By coolwind Note:这个写的略搓,通用性有点差,做zoj3512,因为这个模板WA了几回 */ #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int MAXN = 100010; struct Node{ int l; int r; int val; int dis; int pre; }LHeap[MAXN]; int Merge(int a, int b) { if(a == 0) return b; if(b == 0) return a; if(LHeap[b].val > LHeap[a].val) swap(a,b); LHeap[a].r = Merge(LHeap[a].r,b); LHeap[LHeap[a].r].pre = a; if(LHeap[LHeap[a].r].dis > LHeap[LHeap[a].l].dis) swap(LHeap[a].l,LHeap[a].r); if(LHeap[a].r == 0) LHeap[a].dis = 0; else LHeap[a].dis = LHeap[LHeap[a].r].dis + 1; return a; } int pop(int x) { int l = LHeap[x].l; int r = LHeap[x].r; LHeap[l].pre = l; LHeap[r].pre = r; LHeap[x].l = LHeap[x].r = LHeap[x].dis = 0; return Merge(l,r); } int find(int x) { if(LHeap[x].pre == x) return x; return find(LHeap[x].pre); } int main() { int n,m; int a, b; int i; while(~scanf("%d",&n)) { for(i = 1; i <= n; i ++) { scanf("%d",&LHeap[i].val); LHeap[i].l = LHeap[i].r = LHeap[i].dis = 0; LHeap[i].pre = i; } scanf("%d",&m); while(m --) { scanf("%d%d",&a,&b); int fa = find(a); int fb = find(b); if(fa == fb) { printf("-1\n"); continue; } LHeap[fa].val /= 2; int u = pop(fa); u = Merge(u,fa); LHeap[fb].val /= 2; int v = pop(fb); v = Merge(v,fb); printf("%d\n",LHeap[Merge(u,v)].val); } } return 0; }
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么PostgreSQL不自动缓存执行计划?
· 于是转身独立开发者
· C#.Net筑基-泛型T & 协变逆变
· dotnet 代码调试方法
· DbContext是如何识别出实体集合的
· 免费开源 .NET OpenCV 迷你运行时全平台发布
· 10亿订单如何分库分表?
· 一个static关键字引发的线上故障:深度剖析静态变量与配置热更新的陷阱
· C# 的深度强化学习框架RL_Matrix
· 如何基于three.js(webgl)引擎架构,实现3D医院、3D园区导航,3D科室路径导航