HDU3031 To Be Or Not To Be 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - HDU3031
题意概括
喜羊羊和灰太狼要比赛。
有R次比赛。
对于每次比赛,首先输入n,m,n表示喜羊羊和灰太狼的这次比赛回合数,m表示一开始有m堆数字。
然后输入m个数,第i个(p[i])表示第i堆里面有多少个数。
接下来的m行,第i行有p[i]个数,分别表示第i堆数有哪些。
然后n回合,灰太狼和喜羊羊大战。
两人轮流操作,灰太狼先。
1) T K: 拿到第 k 堆所有数字
2) C: 喜羊羊和灰太狼手中最大的数字进行比较,赢得一方可以把对方的所有数字全部取过来。(牌数如果相同就什么也不干)
3) L: 失去手中最大的数字
4) A P: 手中最大的数字加上P
5) E Q: 手中最大的数字改为Q
然后,每次比赛结束,输出“灰太狼手中数字个数 : 喜羊羊手中数字个数”
所有比赛结束之后,统计灰太狼和喜羊羊赢的次数。
如果灰太狼的次数>=喜羊羊的次数,那么输出"Hahaha...I win!!"
否则输出"I will be back!!"
题解
这题就是题意比较难理解。
几乎是裸的可并堆,左偏树一发就可以了。
应该不需要解释吧。
不会的自己去看左偏树。
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
const int M=105,N=M*10000;
int Case,n,m,p[M],root[M],v1=0,v0=0;
int ls[N],rs[N],npl[N],val[N],cnt;
void makeheap(int x,int v){
ls[x]=rs[x]=npl[x]=0;
val[x]=v;
}
int merge(int a,int b){
if (!a||!b)
return a+b;
if (val[a]<val[b])
swap(a,b);
rs[a]=merge(rs[a],b);
if (npl[rs[a]]>npl[ls[a]])
swap(rs[a],ls[a]);
npl[a]=npl[rs[a]]+1;
return a;
}
void pop(int &rt){
rt=merge(ls[rt],rs[rt]);
}
void change(int &rt,int v){
int x=merge(ls[rt],rs[rt]);
makeheap(rt,v);
rt=merge(rt,x);
}
int main(){
scanf("%d",&Case);
while (Case--){
cnt=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
scanf("%d",&p[i]);
memset(root,0,sizeof root);
for (int i=1;i<=m;i++)
for (int j=1,x;j<=p[i];j++){
scanf("%d",&x);
makeheap(++cnt,x);
root[i]=merge(root[i],cnt);
}
int x[2],rt[2];
memset(rt,0,sizeof rt);
memset(x,0,sizeof x);
for (int i=1;i<=n;i++){
char op[2];
int a;
scanf("%s",op);
if (op[0]=='T'){
scanf("%d",&a);
rt[i&1]=merge(rt[i&1],root[a]);
x[i&1]+=p[a];
}
if (op[0]=='C'){
if (val[rt[0]]==val[rt[1]])
continue;
if (val[rt[0]]>val[rt[1]]){
x[0]+=x[1];
x[1]=0;
rt[0]=merge(rt[0],rt[1]);
rt[1]=0;
}
else {
x[1]+=x[0];
x[0]=0;
rt[1]=merge(rt[1],rt[0]);
rt[0]=0;
}
}
if (op[0]=='L'){
pop(rt[i&1]);
x[i&1]--;
}
if (op[0]=='A'){
scanf("%d",&a);
change(rt[i&1],val[rt[i&1]]+a);
}
if (op[0]=='E'){
scanf("%d",&a);
change(rt[i&1],a);
}
}
printf("%d:%d\n",x[1],x[0]);
if (x[1]>=x[0])
v1++;
else
v0++;
}
puts(v1<v0?"I will be back!!":"Hahaha...I win!!");
return 0;
}
HDU3031 To Be Or Not To Be 左偏树 可并堆的更多相关文章
- [note]左偏树(可并堆)
左偏树(可并堆)https://www.luogu.org/problemnew/show/P3377 题目描述 一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 ...
- bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...
- [luogu3377][左偏树(可并堆)]
题目链接 思路 左偏树的模板题,参考左偏树学习笔记 对于这道题我是用一个并查集维护出了哪些点是在同一棵树上,也可以直接log的往上跳寻找根节点 代码 #include<cstdio> #i ...
- BZOJ1455 罗马游戏 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...
- HDU5818 Joint Stacks 左偏树,可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU5818 题意概括 有两个栈,有3种操作. 第一种是往其中一个栈加入一个数: 第二种是取出其中一个栈的顶 ...
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- Monkey King(左偏树 可并堆)
我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...
- BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)
题意 略 分析 稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有 ...
随机推荐
- Linux 重启网卡失败 Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
linux下重启网卡使用命令 : service network restart 时报错: [root@slave01 hadoop]# service network restart Startin ...
- Java SE之正则表达式Demo
@Test public void regex() {//匹配教务系统课程 // String content = "公共机座 (1-10)".replaceAll(" ...
- pandas 定位 loc,iloc,ix
In [114]: df Out[114]: A B C D 2018-06-30 0.318501 0.613145 0.485612 0.918663 2018-07-31 0.614796 0. ...
- 改变checkbox的默认样式
针对于CheckBox默认样式的改变,和选中状态的改变 <label class="checkBox"><input type="checkbox&qu ...
- caffe-win10-cifar10另
上一篇主要以bat形式实现了leveldb形式的cifar10,因为对于shell脚本不甚熟悉,所以这次专门利用.sh调用来实现lmdb形式的cifar10. 1.下载数据 同上一篇. 2.数据转换和 ...
- Linux串口—struct termios结构体【转】
转自:https://blog.csdn.net/yemingzhu163/article/details/5897156 一.数据成员 termios 函数族提供了一个常规的终端接口,用于控制非同步 ...
- Linux的capability深入分析(2)【转】
转自:https://blog.csdn.net/wangpengqi/article/details/9821231 rpm -ql libcap-2.16-5.2.el6.i686 /lib/l ...
- VC++常用数据类型
原文地址:https://www.cnblogs.com/yincheng01/archive/2008/12/31/2213386.html 一. VC常用数据类型列表 二 ...
- React-Native 之 项目实战(一)
前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...
- 020_秘钥管理服务器vault
一. https://github.com/hashicorp/vault #待研究