Joint Stacks---hdu5818(栈模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5818
有3个操作pop,push,merge A B;
引入一个新的栈C,每次合并的时候就把A和B合并到C上,然后把A和B都清空. push还是按正常做,
pop时注意当遇到要pop的栈为空时,因为题目保证不会对空栈进行pop操作,所以这时应直接改为对C栈进行pop操作.
这样做因为保证每个元素最多只在一次合并中被处理到,pop和push操作当然也是每个元素只做一次,所以总复杂度是O(N)的;
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
#define N 105
#define met(a, b) memset(a, b, sizeof(a)) typedef long long LL; struct node
{
int Id, num;
node(){}
node(int Id, int num) : Id(Id), num(num){}
}; int main()
{
int n, tCase = ;
while(scanf("%d", &n) , n)
{
stack<node> a;
stack<node> b;
stack<node> c;
stack<node> t;
printf("Case #%d:\n", tCase++);
for(int i=; i<=n; i++)
{
char s1[], s2[];
int num;
scanf("%s", s1);
if(strcmp(s1, "push") == )
{
scanf("%s %d", s2, &num);
if(s2[] == 'A')
a.push(node(i, num));
else
b.push(node(i, num));
}
else if(strcmp(s1, "pop") == )
{
scanf("%s", s2);
if(s2[] == 'A')
{
if(!a.empty())
{
node p = a.top();a.pop();
printf("%d\n", p.num);
}
else
{
node p = c.top();c.pop();
printf("%d\n", p.num);
}
}
else
{
if(!b.empty())
{
node p = b.top();b.pop();
printf("%d\n", p.num);
}
else
{
node p = c.top();c.pop();
printf("%d\n", p.num);
}
}
}
else
{
node p, q;
scanf("%s %s", s1, s2);
while(!a.empty() && !b.empty())
{
p = a.top();
q = b.top();
if(p.Id > q.Id)
{
t.push(p);
a.pop();
}
else
{
t.push(q);
b.pop();
}
}
while(!a.empty())
{
p = a.top();
a.pop();
t.push(p);
}
while(!b.empty())
{
p = b.top();
b.pop();
t.push(p);
} while(!t.empty())
{
p = t.top();
t.pop();
c.push(p);
}
}
}
}
return ;
}
Joint Stacks---hdu5818(栈模拟)的更多相关文章
- HDU 5818 Joint Stacks ——(栈的操作模拟,优先队列)
题意:有两个栈A和B,有3种操作:push,pop,merge.前两种都是栈的操作,最后一种表示的是如果“merge A B”,那么把B中的元素全部放到A中,且满足先入后出的栈原则. 分析:显然,我们 ...
- 暑假练习赛 004 E Joint Stacks(优先队列模拟)
Joint StacksCrawling in process... Crawling failed Time Limit:4000MS Memory Limit:65536KB 64 ...
- 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(模拟)
题目链接: Joint Stacks Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 多校7 HDU5818 Joint Stacks
多校7 HDU5818 Joint Stacks 题意:n次操作.模拟栈的操作,合并的以后,每个栈里的元素以入栈顺序排列 思路:开三个栈,并且用到了merge函数 O(n)的复杂度 #include ...
- HDU 5818 Joint Stacks(联合栈)
HDU 5818 Joint Stacks(联合栈) Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU5818 Joint Stacks
Joint Stacks Time Limit: 8000/ ...
- 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(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
随机推荐
- 【RF库测试】算法运算
- Android开发-- Genymotion模拟器
模拟器安装 http://blog.csdn.net/beiminglei/article/details/13776013 连接ADB http://android3g.diandian.com/p ...
- Mac终端解压命令集合
tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压1 ...
- ScaleType属性
FIT_CENTER 把原图按照比例放大缩小到ImageView的高度,显示在ImageView的center(中部/居中显示). 1 2 CENTER_CROP 会拉伸图片以原图填满ImageV ...
- 微信公众号access_token的获取与存储
如果是一个用户触发,那么只要将access_token放在数据库,文件,nosql就行,取时判断时间是否过期,过期重新去微信获取再放入. 如果是很多用户,多进程并发,特别是分布式那种架构呢?进程A判断 ...
- c++学习笔记—c++对txt文件的读取与写入
一.文件的输入输出 头文件fstream定义了三个类型支持文件IO:ifstream从给定文件读取数据.ofstream向一个给定文件写入数据.fstream读写给定数据.这些类型与cin和cout的 ...
- 查看sql server日志
如果是查询当前已经连接到服务器的用户 select loginame, * from master.dbo.sysprocesses 查看sql 的操作日志记录 SELECT * From ::fn_ ...
- C++播放wav音乐和音效
1. #include <mmsystem.h>#pragma comment(lib,"winmm.lib")PlaySound(TEXT("c:\\te ...
- Windows驱动中通过MDL实现用户态与核心态共享内存
Windows驱动跑在核心态(Kernel mode),驱动的调用者跑在用户态.如何使用户态进程与核心态驱动共享内存呢 ? 我们知道32位Windows中,默认状态下虚拟空间有4G,前2G是每个进程私 ...
- 题目1461:Tempter of the bone(深度优先遍历DFS)
题目链接:http://ac.jobdu.com/problem.php?pid=1461 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...