hdu1512 zoj2334Monkey King(左偏树 + 并查集)

news/2024/11/17 23:46:10/

参考:http://blog.csdn.net/pi9nc/article/details/11827501
题目:https://vjudge.net/problem/HDU-1512

他的注释很详细.

题目大意:有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了,不打不相识嘛。现在给m组询问,如果2只猴子相互认识,输出-1,否则他们各自找自己认识的最牛叉的猴子单挑,求挑完后这拨猴子力量最大值。
#include<bits/stdc++.h>using namespace std;
#define MP make_pair
#define N 100005
#define LL long long
#define pb push_back
#define fi first
#define se second
#define pii pair<int, int>
#define md ((ll+rr)>>1)
#define ls (i<<1)
#define rs ((i<<1)|1)
#define lson ls,ll,md
#define rson rs,md+1,rrint n,m;
int fa[N];
int a[N];
int l[N],r[N],v[N],d[N];
int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);
}int merge(int x,int y){if(!x)return y;if(!y)return x;if(v[x]<v[y])swap(x,y);//大根堆r[x]=merge(r[x],y);fa[r[x]]=x;//并查集的部分if(d[l[x]]<d[r[x]])swap(l[x],r[x]);d[x]=d[r[x]]+1;return x;
}
int pop(int x){fa[l[x]]=l[x];fa[r[x]]=r[x];//先把左儿子设自己为跟,右儿子也是int ll=l[x],rr=r[x];l[x]=r[x]=d[x]=0;//printf("%d %d\n",ll,rr);return merge(ll,rr);
}
int tot;
void Init(int x){tot++;v[tot]=x;l[tot]=r[tot]=d[tot]=0;
}
int main(){while(~scanf("%d",&n)){tot=0;for(int i=1;i<=n;++i){scanf("%d",&a[i]);fa[i]=i;Init(a[i]);}scanf("%d",&m);for(int i=1;i<=m;++i){int x,y;scanf("%d%d",&x,&y);int fx=Find(x),fy=Find(y);if(fx==fy)puts("-1");else{int tmpx=pop(fx);//先把最小的取出来v[fx]/=2;fx=merge(tmpx,fx);//再合并回去.找到合适的位置插入,这样就不会违反堆 的性质int tmpy=pop(fy);v[fy]/=2;fy=merge(tmpy,fy);printf("%d\n",v[merge(fx,fy)]);}}}
}

http://www.ppmy.cn/news/271990.html

相关文章

HDOJ 1512 Monkey King -- 左偏树

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1512 分析&#xff1a;左偏树应用。在结点中加入了parent指针和id字段&#xff0c;这样可以代替并查集。关于左偏树可以参考黄源河的论文《左偏树的特点及其应用》。 #include #include #include #include #in…

第 197 场周赛 leetcode 1512. 好数对的数目 1513. 仅含 1 的子串数 1514. 概率最大的路径

1512. 好数对的数目 直接算每个数即可 class Solution { public:int numIdenticalPairs(vector<int>& nums) {int mp[110]{0};memset(mp,0,sizeof(0));for(int i0;i<nums.size();i){mp[nums[i]];}long long ans0;for(int i0;i<100;i){ans(long long)mp[i]*(m…

一文看尽深度学习中的20种卷积(附源码整理和论文解读)

点击上方“计算机视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 引言 卷积&#xff0c;是卷积神经网络中最重要的组件之一。不同的卷积结构有着不一样的功能&#xff0c;但本质上都是用于提取特征。比如&#xff0c;在传统图像处理中&#xff0c;人们通过设定不同的算子…

ZYNQ Linux 双网口,MDIO共用,RESET-GPIO不共用

目录 前言一、硬件方案二、第一种方法&#xff1a;只配置设备树二、第二种方法&#xff1a;修改内核驱动和设备树1. 修改设备树2. 修改设备树kernel中 PHY GPIO 复位程序修改3. kernel中 PHY LED指示灯配置修改 三、文件系统中 网络配置文件修改四、U-Boot 中添加PHY GPIO Rese…

supersocket client 固定端口_西门子CPU控制器1512P-1PN端口交换机附件200KB

西门子CPU控制器1512P-1PN端口交换机附件200KB 浔之漫智控技术(上海)有限公司 上海诗慕自动化设备有限公司本公司销售西门子自动化产品&#xff0c;全新原装&#xff0c;质量保证&#xff0c;价格优势西门子PLC,西门子触摸屏&#xff0c;西门子数控系统&#xff0c;西门子…

【HDOJ】1512 Monkey King

左偏树并查集。左偏树就是可合并二叉堆。 1 /* 1512 */2 #include <iostream>3 #include <string>4 #include <map>5 #include <queue>6 #include <set>7 #include <stack>8 #include <vector>9 #include <deque>10 #include …

力扣1748,387,1941,448,1512,1711题解

文章目录 1748. 唯一元素的和计数法哈希表&#xff08;STL&#xff09; 387. 字符串中的第一个唯一字符计数法统计出现次数&#xff0c;然后一次循环返回索引哈希表存次数 1941. 检查是否所有字符出现次数相同统计每一个字符出现的次数&#xff0c;然后都和第一个次数比较相等与…

CF1512E Permutation by Sum(思维)

题目传送门 这道题是我灵光一闪突然想到的做法。 首先叙述一下题意&#xff1a; 这道题的意思就是说&#xff1a;给你四个数n,a,b,s让你构造一个长度为n的数字序列&#xff0c;这个序列的要求是数字必须是在1~n中的&#xff0c;而且不能有重复的数字&#xff0c;并且在下标a ~ …