【HDU 5818多校】Joint Stacks
用两个栈模拟,并保存每个点的时间戳。每次合并的时候记录合并时的时间戳mcnt和此时的topa和topb记做ta、tb。
每次pop的时候,如果栈的top的时间戳大于mcnt,则普通地pop,否则就在两个栈ta和tb下面找时间戳最大且还没pop掉的。然后用bj[时间戳]来标记已经pop了。
#include <cstdio>
#include <cstring>
#define N 100005
using namespace std;
struct node{
int id,v;
}a[N],b[N];
int bj[N],n,topa,topb,cnt,ele,ta,tb,mcnt,cas;
char op[],st;
void popc(){
while(bj[a[ta].id])ta--;
while(bj[b[tb].id])tb--;
if(a[ta].id>b[tb].id){
printf("%d\n",a[ta].v);
bj[a[ta].id]=;
}else {
printf("%d\n",b[tb].v);
bj[b[tb].id]=;
}
}
int main() {
while(scanf("%d",&n),n){
printf("Case #%d:\n",++cas);
topa=topb=cnt=mcnt=;
memset(bj,,sizeof bj);
for(int i=;i<=n;i++){
scanf("%s %c",op,&st);
if(op[]=='u'){
scanf("%d",&ele);
if(st=='A')
a[++topa]=(node){++cnt,ele};
else
b[++topb]=(node){++cnt,ele};
}else if(op[]=='o'){
if(st=='A'){
if(a[topa].id>mcnt){
printf("%d\n",a[topa].v);
bj[a[topa].id]=;
topa--;
}
else
popc();
}else{
if(b[topb].id>mcnt){
printf("%d\n",b[topb].v);
bj[b[topb].id]=;
topb--;
}
else
popc();
}
}else if(op[]=='e'){
scanf(" %c",&st);
mcnt=cnt;
ta=topa;
tb=topb;
}
}
}
return ;
}
wa了好几发,结果原因是 “if(a[topa].id>mcnt)”写的是>=,为什么等于不可以呢,因为popc函数里没有top--,这样下一次top的值可能已经pop掉了。那如果在popc里面top--呢,也不行,因为pop栈a的ta时,可能在pop栈b,这样to pa--的话就错了。这题用优先队列也很方便。
#include <cstdio>
#include <queue>
#define prq priority_queue
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
#define cl(a) while(!a.empty())a.pop();
using namespace std;
prq<pii> a,b,c;
int n,cas;
void pop(prq<pii> &q){
if(!q.empty()){
printf("%d\n",q.top().second);
q.pop();
}else{
printf("%d\n",c.top().second);
c.pop();
}
}
void push(prq<pii> &q){
while(!q.empty()){
c.push(q.top());
q.pop();
}
}
int main() {
while(scanf("%d",&n),n){
printf("Case #%d:\n",++cas);
cl(a);cl(b);cl(c);
int cnt=;
while(n--){
char op[],st;
scanf("%s %c",op,&st);
if(op[]=='u'){
int x;
scanf("%d",&x);
if(st=='A') a.push(mp(++cnt,x));
else b.push(mp(++cnt,x));
}else if(op[]=='o'){
if(st=='A') pop(a);
else pop(b);
}else{
scanf(" %c",&st);
push(a);push(b);
}
}
}
}
【HDU 5818多校】Joint Stacks的更多相关文章
- 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(联合栈)
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 ...
- 2016暑假多校联合---Joint Stacks (STL)
HDU 5818 Problem Description A stack is a data structure in which all insertions and deletions of e ...
- 多校7 HDU5818 Joint Stacks
多校7 HDU5818 Joint Stacks 题意:n次操作.模拟栈的操作,合并的以后,每个栈里的元素以入栈顺序排列 思路:开三个栈,并且用到了merge函数 O(n)的复杂度 #include ...
- 暑假练习赛 004 E Joint Stacks(优先队列模拟)
Joint StacksCrawling in process... Crawling failed Time Limit:4000MS Memory Limit:65536KB 64 ...
- HDU5818 Joint Stacks
Joint Stacks Time Limit: 8000/ ...
随机推荐
- Oracle中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- js数组操作
用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多, 自以为js高手的自己居然无从下手,一下狠心,我学! ...
- CSS3 3D骰子
z zz zz zzzz zzzzz zzzzzz
- Memcached的安装和使用以及nginx整合memcached
一.模块的安装启动 wget http://cdnetworks-kr-2.d1.sourceforge.net/project/levent/libevent/libevent-2.0/libeve ...
- Bootstrap系列 -- 7. 列表排版方式
一. 去点列表 1. 使用class=list-unstyled <ul > <li>无序列表项目</li> <li>无序列表项目</li> ...
- Bootstrap系列 -- 43. 固定导航条
很多情况之一,设计师希望导航条固定在浏览器顶部或底部,这种固定式导航条的应用在移动端开发中更为常见.Bootstrap框架提供了两种固定导航条的方式: .navbar-fixed-top:导航条固定 ...
- C# 序列化与反序列化
我们先说说什么是序列化.所谓的序列化就是把要保存的内容以特定的格式存入某种介质中.比如我们要保存一些数据在下次程序启动的时候再读入.我们一般就是把这个数据写在一个本地的文本中.然后程序启动的时候去读入 ...
- 20140207 - Java and Mac OS X Retina
在Mac下使用文件管理工具类似Total Commander的muCommander,muCommander的编写语言是Java,打开后发现Java不兼容Mac Retina. muCommander ...
- [BZOJ2768][JLOI2010]冠军调查(最小割)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2768 分析: 如果一个点i认为是0,则连一条S->i,如果认为是1,则i-> ...
- 【BZOJ1001】狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 7530 Solved: 1724[Submit][S ...