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 ...
随机推荐
- asp.net 9 ViewState
VIEWSTATE aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&quo ...
- Redis基本数据
Redis Redis是一个速度非常快的非关系数据库(NoSql),它可以存储键(key)与五种不同的值(value)之间的映射.可以将存储的内存的键值对数据持久化到硬盘. Redis 数据结构 Re ...
- c# 后台隐式使用webBrowser
c#不使用 webBrowser 控件, 在后台加载html流 private void button1_Click(object sender, EventArgs e) { string urlP ...
- dev grid的一些使用
保留选中数据,其他数据删除,不操作数据库 private void butnoremove_Click(object sender, EventArgs e) { int iSelectRowCoun ...
- devXpress ribbonForm处理
1.图标处理 这个图标是通过 Element Ribbon API
- 【ExtJs】获取grid选中的records
var records = me.grid.getSelectionModel().getSelection(); //获取所有选中的行 var record =records[0]; //获取选中行 ...
- js获取图片信息
网络图片: fetch(item.path).then(function(res){ // 计算图片大小 return res.blob() }).then(function(data){ conso ...
- redis集群+JedisCluster+lua脚本实现分布式锁(转)
https://blog.csdn.net/qq_20597727/article/details/85235602 在这片文章中,使用Jedis clien进行lua脚本的相关操作,同时也使用一部分 ...
- python图像处理
Python常用处理图像的库是PIL,另外还有opencv.Matplotlib.NumPy.SciPy.skimage 详情请参考:https://www.cnblogs.com/qiaozhoul ...
- Liunx命令问题
第一个问题是:快速杀死服务 第一步:查看进程号pid ps -u my_account -o pid,rss,command | grep redis 第二步:杀死进程 k ...