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把所有 ...
随机推荐
- springboot+rabbitmq整合示例程
关于什么是rabbitmq,请看另一篇文: http://www.cnblogs.com/boshen-hzb/p/6840064.html 一.新建maven工程:springboot-rabbit ...
- ubuntu 18.04下character_set_server设置为utf8
打开/etc/mysql/mysql.conf.d/mysql.cnf添加以下代码: character-set-server = utf8 然后重启mysql即可
- js scroll函数
$(function () { $(".sticky").hide(); var top = $(window).scrollTop(); if (top >= 100) { ...
- Javascript定义变量
在JavaScript中通过var来定义变量,不管是数字还是字符串,都可以通过这种方式来定义:我们既可以在声明变量的同时给变量赋值,也可以先声明变量,再给变量赋值. <script> va ...
- php rsa理解
参考链接:http://www.cnblogs.com/firstForEver/p/5803940.html 自己封装的一个类: <?php class CRsaAuthorization { ...
- mysql 案例~ 主从复制转化为级联复制
一 需求 mysql 主从复制切换成级联复制二 核心思想 1 开启级联复制 2 确定postion点场景 A->B A-C 三 切换步骤 1 先确定好B为级联复制库 2 B添加log_upd ...
- 根据href给当前导航添加样式
var href = window.location.href.split('/')[window.location.href.split('/').length-1].substr(0,20); i ...
- 使用layer 弹出对话框 子父页面相互参数传递 父页面获取子页面参数实例
一.先看效果: 1.点击三个点的图标弹出了子页面: 2.子页面调用父页面方法,图一调用父页面方法,图二得到父页面var变量. 3.选择之后,关闭弹框,父页面得到子页面单选框选择的v ...
- 在手机的浏览器上通过连接打开App
Android系统中实现 1.在系统系统自带的浏览器中 首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]& ...
- 【转】C/C++内存泄漏及检测
“该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败.内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用ma ...