HDU 5818 Joint Stacks ——(栈的操作模拟,优先队列)
题意:有两个栈A和B,有3种操作:push,pop,merge。前两种都是栈的操作,最后一种表示的是如果“merge A B”,那么把B中的元素全部放到A中,且满足先入后出的栈原则。
分析:显然,我们给每一个节点配备一个时间戳即可。我一开始的思路是直接开两个优先队列进行直接模拟,merge操作就是把一个栈的元素全部倾倒到另一个栈内,但是会出现的问题是,如果有一个状态A和B的元素都相当多了,并且反复的进行merge操作,那么每一次merge都意味着大量的元素进出,肯定会超时的。因此,我们需要优化,优化方法是:再开一个栈com,merge的时候我们把A和B都清空,然后把这些元素放到com内即可。当进行pop操作时,如果当前栈是空的,那么就到com栈里面去找。这样的好处是,可以应付上面这个情况,如果反复merge,因为A和B都是空的,是不会进行操作的。另外要说明的一点是,显然对于每个元素它被移动到com里的次数是不会超过1次的,所以复杂度是O(n),再加上对优先队列的操作,总的复杂度是O(nlogn)。
参考博客:http://www.cnblogs.com/Sunshine-tcf/p/5753964.html。
代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std; struct node
{
int a,t;
bool operator < (const node &temp) const
{
return t < temp.t;
}
}; int main()
{
int n,kase = ;
while(scanf("%d",&n)== && n)
{
printf("Case #%d:\n",kase++);
priority_queue<node> Q1,Q2,com;
for(int i=;i<=n;i++)
{
char s1[],s2[],s3[];
int temp;
scanf("%s",s1);
if(strcmp(s1,"push")==)
{
scanf("%s%d",s2,&temp);
if(s2[]=='A')
{
Q1.push((node){temp,i});
}
else
{
Q2.push((node){temp,i});
}
}
else if(strcmp(s1,"pop")==)
{
scanf("%s",s2);
if(s2[]=='A')
{
if(!Q1.empty())
{
node a = Q1.top();Q1.pop();
printf("%d\n",a.a);
}
else
{
node a = com.top();com.pop();
printf("%d\n",a.a);
}
}
else
{
if(!Q2.empty())
{
node a = Q2.top();Q2.pop();
printf("%d\n",a.a);
}
else
{
node a = com.top();com.pop();
printf("%d\n",a.a);
}
}
}
else
{
scanf("%s%s",s2,s3);
while(!Q1.empty())
{
node a = Q1.top();Q1.pop();
com.push(a);
}
while(!Q2.empty())
{
node a = Q2.top();Q2.pop();
com.push(a);
}
}
}
}
return ;
}
HDU 5818 Joint Stacks ——(栈的操作模拟,优先队列)的更多相关文章
- HDU 5818 Joint Stacks(联合栈)
HDU 5818 Joint Stacks(联合栈) Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU 5818 Joint Stacks (优先队列)
Joint Stacks 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5818 Description A stack is a data stru ...
- HDU 5818 Joint Stacks
Joint Stacks Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- hdu 5818 Joint Stacks (优先队列)
Joint Stacks Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- HDU - 5818 Joint Stacks 比较大の模拟,stack,erase
https://vjudge.net/problem/HDU-5818 题意:给你两个栈AB,有常规push,pop操作,以及一个merge操作,merge A B 即将A.B的元素按照入栈顺序全部出 ...
- HDU 5818 Joint Stacks(左偏树)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5818 [题目大意] 给出两个栈A B(初始时为空),有三种操作: push.pop.merge. ...
- HDU 5818:Joint Stacks(stack + deque)
http://acm.hdu.edu.cn/showproblem.php?pid=5818 Joint Stacks Problem Description A stack is a data ...
- hdu 5818 (优先队列) Joint Stacks
题目:这里 题意: 两个类似于栈的列表,栈a和栈b,n个操作,push a x表示把数x放进a栈的栈底,pop b 表示将栈b的栈顶元素取出输出,并释放这个栈顶元素,merge a b表示把后面的那个 ...
- 暑假练习赛 004 E Joint Stacks(优先队列模拟)
Joint StacksCrawling in process... Crawling failed Time Limit:4000MS Memory Limit:65536KB 64 ...
随机推荐
- O060、Restore Volume 操作
参考https://www.cnblogs.com/CloudMan6/p/5668872.html 前面我们学习了backup操作,现在我们来学习如何使用backup进行restore. r ...
- java面试6
1.Redis是单线程还是多线程?为什么能支持访问量和高并发?并举例解释? 1)Redis是单线程的 2)Redis是单线程加多路IO复用 3)例子:上课老师解决同学们的提问 2.Nginx有哪些基本 ...
- 百度 Ueditor 使用及规则
UMeditor 官网::https://ueditor.baidu.com/website/download.html#ueditor文档::http://fex.baidu.com/ueditor ...
- mint-ui下拉加载min和上拉刷新(demo实例)
<template> <div class="share"> <div class="header"> <div cl ...
- MongoDB 各个位版本下载地址
官网首页下载需要填写资料 windows版本 Linux版本
- 【4】Zookeeper数据模型
一.Znode节点是什么 1.1.概念 Znode节点是Zookeeper中数据模型中最小的数据单元.Zookeeper的数据模型是一颗树,由"/"进行分割路径.每个znode ...
- 【异常】lockfile.AlreadyLocked: ~/airflow/airflow-scheduler.pid is already locked
1 完整异常信息 File "/usr/bin/airflow", line 32, in <module> args.func(args) File "/u ...
- 如何设置树莓派 -Zero 自启动连接WIFI
1. 首先我们需要一台可以读取树莓派跟文件系统的Linux虚拟机(比如Ubuntu) 将树莓派SD卡系统插入电脑,识别并打开rootfs文件夹,切换到`rootfs/etc/wpa_supplican ...
- 制作CentOS8安装U盘时遇到的“Minimal BASH-like...”问题
---恢复内容开始--- CentOS8已经推出了,正好最近新到了块服务器硬盘需要安装系统,就拿过来尝一下鲜. 下载好iso文件后,以制作CentOS7安装盘相同的步骤,用UltroISO(软碟通)往 ...
- SVN搭建以及客户端使用
第1章 CentOS下搭建SVN服务器 1.1 SVN简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. ...