HDU5818(模拟)
来源:互联网 发布:物理tracker软件 编辑:程序博客网 时间:2024/06/03 11:51
题目链接:ttp://acm.hdu.edu.cn/showproblem.php?pid=5818
直接模拟会超时,因为多次merge操作可能将队列中的元素从一个队列移到另一个队列,可能执行多次。
因此,想到再开一个队列3,将合并操作,改为将两个队列中的元素都推入队列3中,因为题目给出不会出现pop空的情况,所以如果弹出操作发现当前队列为空,直接从队列3中弹出即可。
这里贴一个网上更好的做法,只用一个队列存数,用a,b,变量记录两个几何当前的位置。用pre数组记录前驱,也就是模拟指针操作。
博主http://blog.csdn.net/queuelovestack/article/details/52164782
【分析】
每次执行merge操作时,若总是将栈内元素弹出再压入,感觉复杂度有点高
而且还要按照输入顺序,这个如果开始分开放的话有点摸不着头绪
所以我们不妨用一个数组一开始就将所有元素按照输入先后存放,而要区分是哪个栈的元素的话,不妨用两个指针a,b指向栈顶元素位置
用pre[i]数组记录i位置这个元素的前一个元素的位置
那pop操作,无非就是指针前移,即a=pre[a]或b=pre[b]
那merge操作怎么搞呢?比如merge A B,因为A,B合成一个栈A,所以我们把栈B指针指向栈底,即令b=0;a则指向原先A,B栈栈顶元素较高地址,并把此处pre[a]赋值为-1表示这之前的所有元素都已经在一个栈中,即A
#include <set>#include <map>#include <list>#include <cmath>#include <ctime>#include <deque>#include <queue>#include <stack>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <cassert>#include <cstdlib>#include <cstring>#include <sstream>#include <iostream>#include <algorithm>#define PI acos(-1.0)#define maxn (20000 + 50)#define MOD 1000000009#define INF 0x3f3f3f3f#define Lowbit(x) (x & (-x))#define mem(a,x) memset(a,x,sizeof(a))#define Read() freopen("in.txt", "r", stdin);#define Write() freopen("out.txt", "w", stdout);#define bitnum(a) __builtin_popcount(a)using namespace std;const int N = 100005;const int M = 16;char ch[15],u[5],v[5];int pre[N],s[N];bool vis[N];int main(){ int n,i,p=1,m,k,a,b; while(scanf("%d",&n)&&n) { memset(vis,false,sizeof(vis)); vis[0]=true; a = b = 0;k = 1; printf("Case #%d:\n",p++); for(i=0;i<n;i++){ scanf("%s",ch); if(ch[1]=='u'){ scanf("%s%d",u,&m); s[k]=m;vis[k]=true; if(u[0]=='A') pre[k] = a,a = k++; //这种构造很巧妙 else pre[k] = b,b = k++; } else if(ch[1]=='o'){ scanf("%s",u); if(u[0]=='A') { printf("%d\n",s[a]); vis[a]=false; if(pre[a]== -1) { a--; while(!vis[a]) a--; pre[a]=-1; } else a=pre[a]; } else{ printf("%d\n",s[b]); vis[b]=false; if(pre[b]==-1){ b--; while(!vis[b]) b--; pre[b]=-1; } else b=pre[b]; } } else{ scanf("%s%s",u,v); if(u[0]=='A') a=max(a,b),b=0,pre[a]=-1; else b=max(a,b),a=0,pre[b]=-1; } } } return 0;}
0 0
- HDU5818(模拟)
- 【HDU5818】Joint Stacks(模拟)
- hdu5818 模拟栈
- hdu5818
- hdu5818
- hdu5818(2016多校第7场,模拟)
- HDU5818 Joint Stacks 2016 Multi-University Training Contest 7(模拟)
- hdu5818 Joint Stacks(优先队列)
- 2016多校第七场1010(hdu5818)
- HDU5818(多校第七场)——Joint Stacks(优先队列,左偏树)
- HDU5818之优先队列
- hdu5818栈的操作
- hdu5818 Joint Stacks 数据结构
- HDU5818 Joint Stacks
- HDU5818-Joint Stacks
- 2016多校联合训练7&&HDU5818
- 2016多校训练Contest7: 1010 Joint Stacks hdu5818
- 多校赛第7场 hdu5818 Joint Stacks 双向链表
- 1102. Invert a Binary Tree (25)-PAT甲级真题
- 用js或者jQuery判断数组中含某个元素
- POJ 1365 Prime Land(质因数分解)
- hadoop 三个节点集群的安装部署
- 简单的javascript学习02
- HDU5818(模拟)
- Java泛型-类型擦除
- UE4控制三自由度动感平台
- HDU 2255 (KM()算法)
- 计算机快捷键
- c/c++第十三天
- 洛谷 P2383 狗哥玩木棒
- POJ 3253 Fence Repair 优先队列
- 有关位操作的总结