题意:有两个栈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 ——(栈的操作模拟,优先队列)的更多相关文章

  1. HDU 5818 Joint Stacks(联合栈)

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

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

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

  3. HDU 5818 Joint Stacks

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

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

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

  5. HDU - 5818 Joint Stacks 比较大の模拟,stack,erase

    https://vjudge.net/problem/HDU-5818 题意:给你两个栈AB,有常规push,pop操作,以及一个merge操作,merge A B 即将A.B的元素按照入栈顺序全部出 ...

  6. HDU 5818 Joint Stacks(左偏树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5818 [题目大意] 给出两个栈A B(初始时为空),有三种操作: push.pop.merge. ...

  7. HDU 5818:Joint Stacks(stack + deque)

    http://acm.hdu.edu.cn/showproblem.php?pid=5818 Joint Stacks Problem Description   A stack is a data ...

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

    题目:这里 题意: 两个类似于栈的列表,栈a和栈b,n个操作,push a x表示把数x放进a栈的栈底,pop b 表示将栈b的栈顶元素取出输出,并释放这个栈顶元素,merge a b表示把后面的那个 ...

  9. 暑假练习赛 004 E Joint Stacks(优先队列模拟)

    Joint StacksCrawling in process... Crawling failed Time Limit:4000MS     Memory Limit:65536KB     64 ...

随机推荐

  1. url协议+域名+端口号

    string url = System.Web.HttpContext.Current.Request.Url.Scheme + "://" +                   ...

  2. 随便----js参考书

    一.Javascript方面的书籍: 1 JavaScript权威指南(第6版):号称javascript圣经,前端必备:前端程序员学习核心JavaScript语言和由Web浏览器定义的JavaScr ...

  3. WIN7(WINDOWS7)在添加网络打印机时提示这个,这里的密码是什么密码,能不能不用密码?

    360急救箱应该提高计算机的网络访问安全性,加上与验证机制,所以当你要访问的网络资源,你需要输入用户名和密码进行认证. 1,点击“开始 - 运行”,输入gpedit.msc然后按Enter键. 2,计 ...

  4. 【ES6 】声明变量的方式

    var function let const import class

  5. O025、OpenStack 通用设计思路

    参考https://www.cnblogs.com/CloudMan6/p/5427981.html   API 前端服务   每个OpenStack组件可能包含若干子服务,其中必定有一个API服务负 ...

  6. 【ExtJs】在Ext.grid.Panel中,两列的值相乘作为第三列的值的实现

    如: 商品总价=商品单价*商品数量 方法: 商品总价列,使用其renderer属性,为期定义一个方法,该方法将当前record中的另外两列中2个数据相乘后渲染到该商品总价列.

  7. 【Day1】3.数据类型

     视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...

  8. 使用Gallery制作图片浏览器

    MainActivity.class public class MainActivity extends AppCompatActivity implements AdapterView.OnItem ...

  9. Linux下kafka集群搭建

    环境准备 zookeeper集群环境 kafka是依赖于zookeeper注册中心的一款分布式消息对列,所以需要有zookeeper单机或者集群环境. 三台服务器: 172.16.18.198 k8s ...

  10. 使用select异步IO实现socketserver服务器 源码剖析

    #_*_coding:utf-8_*_ #这是一个echo server,客户端消息,服务端回复相同的消息 import select, socket, sys, queue # Create a T ...