【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5818

【题目大意】

  给出两个栈A B(初始时为空),有三种操作: push、pop、merge. 其中merge是按照A B中元素进栈的相对顺序来重排的.

【题解】

  我们在当A,B栈出现第一个元素时,我们以这个元素建立左偏树,将其root赋值给所属栈,对于插入和输出堆顶操作,我们直接利用左偏树的功能实现,至于A,B的合并,我们将两棵左偏树合并后将一个标志置空即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <utility>
using namespace std;
int n,A,B,x;
char op[10],c[10];
const int N=1000005;
typedef pair<int,int>P;
struct Node{
int l,r,d;P v;
Node(){}
Node(int _l,int _r,int _d,P _v){l=_l,r=_r,d=_d,v=_v;}
}T[N];
int merge(int a,int b){
if(!a)return b;
if(!b)return a;
if(T[a].v<T[b].v)swap(a,b);
T[a].r=merge(T[a].r,b);
if(T[T[a].l].d<T[T[a].r].d)swap(T[a].l,T[a].r);
T[a].d=T[a].r?T[T[a].r].d+1:0;
return a;
}
int pop(int a){
int l=T[a].l,r=T[a].r;
T[a].l=T[a].r=T[a].d=0;
return merge(l,r);
}
int Cas=1;
int main(){
while(~scanf("%d",&n),n){
printf("Case #%d:\n",Cas++);
A=B=0;
for(int i=1;i<=n;i++){
scanf(" %s %s",op,c);
if(op[0]=='m'){
if(c[0]=='A'){
scanf(" %s",c);
if(A==0)A=B,B=0;
else if(B==0)continue;
else A=merge(A,B),B=0;
}else{
scanf(" %s",c);
if(B==0)B=A,A=0;
else if(A==0)continue;
else B=merge(A,B),A=0;
}
}else{
if(op[1]=='o'){
if(c[0]=='A'){
if(A==0)continue;
printf("%d\n",T[A].v.second);
A=pop(A);
}else{
if(B==0)continue;
printf("%d\n",T[B].v.second);
B=pop(B);
}
}else{
scanf("%d",&x);
T[i]=Node(0,0,0,{i,x});
if(c[0]=='A'){
if(A==0)A=i;
else A=merge(A,i);
}else{
if(B==0)B=i;
else B=merge(B,i);
}
}
}
}
}return 0;
}

HDU 5818 Joint Stacks(左偏树)的更多相关文章

  1. HDU5818 Joint Stacks 左偏树,可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU5818 题意概括 有两个栈,有3种操作. 第一种是往其中一个栈加入一个数: 第二种是取出其中一个栈的顶 ...

  2. HDU 5818 Joint Stacks(联合栈)

    HDU 5818 Joint Stacks(联合栈) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  3. hdu 1512 Monkey King 左偏树

    题目链接:HDU - 1512 Once in a forest, there lived N aggressive monkeys. At the beginning, they each does ...

  4. hdu 1512 Monkey King —— 左偏树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512 很简单的左偏树: 但突然对 rt 的关系感到混乱,改了半天才弄对: 注意是多组数据! #includ ...

  5. HDU 1512 Monkey King (左偏树+并查集)

    题意:在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识 (认识具有传递性)的两只猴子之间.争斗时,两只猴子都 ...

  6. HDU 5818 Joint Stacks (优先队列)

    Joint Stacks 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5818 Description A stack is a data stru ...

  7. HDU 5818 Joint Stacks

    Joint Stacks Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  8. hdu 5818 Joint Stacks (优先队列)

    Joint Stacks Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  9. HDU 1512 Monkey King ——左偏树

    [题目分析] 也是堆+并查集. 比起BZOJ 1455 来说,只是合并的方式麻烦了一点. WA了一天才看到是多组数据. 盲人OI (- ̄▽ ̄)- Best OI. 代码自带大常数,比启发式合并都慢 [ ...

随机推荐

  1. NodeJS爬虫系统初探

    NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文 ...

  2. Storm并发度和Grouping方式

    Storm并发度和Grouping方式 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans ...

  3. Jdbc初体验

    Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...

  4. what oop ?

    最近在做一个app的后台代码.......到底是什么是Oop ,没有感觉到啊,,,,,

  5. OpenCV学习 1:OpenCV安装与第一个图像显示程序

    原创作品,转载请注明出处 为了提升逼格,决定学下OpenCV,想想如果可以做人脸识别,定点降落,让飞机跟着自己飞..想想都有点小激动.这只是想的,能不能学会还不知道..哈..      1:先下载:h ...

  6. A类型物料必须为装配拉式,供应子库为B仓

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name MT_BOMFDBOM 表单名 Form Name BOMFDBOM ...

  7. Unix/Linux环境C编程入门教程(8) FreeBSD CCPP开发环境搭建

    1. FreeBSD是一种自由类Unix操作系统,是由经过BSD.386BSD和4.4BSD发展而来的类Unix的一个重要分支.FreeBSD拥有超过200名活跃开发者和上千名贡献者.FreeBSD被 ...

  8. libcurl get post http

    一.              概念 1.         为什么要使用libcurl 1)        作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要 ...

  9. [LeetCode][Python]String to Integer (atoi)

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/string- ...

  10. SQL Server 2008 批量插入数据时报错

    前几天在SQL Server 2008同步产品数据时,总是提示二进制文本被截断的错误,但是经过检查发现数据都符合格式要求. 百思不得其解,单独插入一条条数据则可以插入,但是批量导入则报错. 批量导入代 ...