博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1512 ZOJ2334 Monkey King 左偏树
阅读量:4659 次
发布时间:2019-06-09

本文共 1236 字,大约阅读时间需要 4 分钟。

欢迎访问~原文出处——



题意概括

  在一个森林里住着N(N<=10000)只猴子。在一开始,他们是互不认识的。但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识(认识具有传递性)的两只猴子之间。争斗时,两只猴子都会请出他认识的猴子里最强壮的一只(有可能是他自己)进行争斗。争斗后,这两只猴子就互相认识。每个猴子有一个强壮值,但是被请出来的那两只猴子进行争斗后,他们的强壮值都会减半(例如10会减为5,5会减为2)。现给出每个猴子的初始强壮值,给出M次争斗,如果争斗的两只猴子不认识,那么输出争斗后两只猴子的认识的猴子里最强壮的猴子的强壮值,否则输出 -1。


 

题解

  左偏树大力维护。

  找根就最暴力的来。


 

代码

#include 
#include
#include
#include
#include
using namespace std;const int N=100005;int n,m;int fa[N],ls[N],rs[N],npl[N],val[N];int getf(int k){ while (fa[k]) k=fa[k]; return k;}int merge(int a,int b){ if (!a||!b) return a+b; if (val[a]
npl[ls[a]]) swap(rs[a],ls[a]); npl[a]=npl[rs[a]]+1; return a;}int weaken(int a){ fa[ls[a]]=fa[rs[a]]=0; int b=merge(ls[a],rs[a]); fa[a]=ls[a]=rs[a]=npl[a]=0; val[a]>>=1; return merge(a,b);} int main(){ while (~scanf("%d",&n)){ for (int i=1;i<=n;i++){ scanf("%d",&val[i]); fa[i]=ls[i]=rs[i]=npl[i]=0; } scanf("%d",&m); while (m--){ int a,b; scanf("%d%d",&a,&b); a=getf(a),b=getf(b); if (a==b){ puts("-1"); continue; } a=weaken(a); b=weaken(b); printf("%d\n",max(val[a],val[b])); merge(a,b); } } return 0;}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/HDU1512.html

你可能感兴趣的文章
6.14
查看>>
Google疯了,竟然这样!
查看>>
团队冲刺第九天
查看>>
KingPaper初探redist 之redis设置分析
查看>>
函数库学习入门指引
查看>>
bzoj 2339: [HNOI2011]卡农
查看>>
带参数存储过程的小例子
查看>>
对8086地址的理解.
查看>>
[zz]在python中运行一个外部程序
查看>>
15-浮动
查看>>
Linux下MySQL表名不区分大小写的设置方法
查看>>
求几天后是几月几号1022
查看>>
vc++网络安全编程范例(20)木马防范检测数据端口与进程
查看>>
Tango with Django 1.9 中文——1.概述
查看>>
年度榜单:2012年最流行的28款免费英文字体素材
查看>>
数据类型范围
查看>>
codeforce 8A-8C
查看>>
湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
查看>>
Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式
查看>>
dll和exe的共享节------多进程共享dll/exe全局变量
查看>>