hdu_5818_Joint Stacks(线段树模拟)
2016-08-10 11:30
381 查看
题意:
给你两个栈,多了个合并操作,然后让你模拟
题解:
很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度均摊一下,让每个操作都是logn的,于是用上了线段树模拟。
线段树考虑染色,线段树的区间代表的是操作编号,0代表为A栈,1代表为B栈,每次merge 就把1到i这个区间染成指定颜色,然后pop就在线段树中找最右边的对应颜色的点。这样每次操作都是logn
不过官方题解给的是O(n)的解法,反正我是没想到的,感觉智商被压制。
第一份代码是线段树O(nlogn),第二份代码是数组模拟O(n)。也就只能快400ms
Joint Stacks
比较简单巧妙的一个做法是引入一个新的栈C,每次合并的时候就把A和B合并到C上,然后把A和B都清空. push还是按正常做,pop注意当遇到要pop的栈为空时,因为题目保证不会对空栈进行pop操作,所以这时应直接改为对C栈进行pop操作. 这样做因为保证每个元素最多只在一次合并中被处理到,pop和push操作当然也是每个元素只做一次,所以总复杂度是O(N)的. 另一种做法是用链表来直接模拟,复杂度也是O(N),但代码量稍大一些.
#include<bits/stdc++.h> #define F(i,a,b) for(int i=a;i<=b;++i) using namespace std; typedef pair<int,int>P; const int N=5e4+7; int eda,edb,edc,n,tp,ic=1,c ; char op[10],x[2],y[2]; P a ,b ; int main() { while(scanf("%d",&n),n) { printf("Case #%d:\n",ic++); eda=edb=edc=0; F(i,1,n) { scanf("%s",op); if(op[0]=='p'&&op[1]=='u') { scanf("%s%d",x,&tp); if(x[0]=='A')a[++eda].first=tp,a[eda].second=i; else b[++edb].first=tp,b[edb].second=i; }else if(op[0]=='p') { scanf("%s",x); if(x[0]=='A') { if(eda)printf("%d\n",a[eda--].first); else printf("%d\n",c[edc--]); }else { if(edb)printf("%d\n",b[edb--].first); else printf("%d\n",c[edc--]); } }else { scanf("%s%s",x,y); for(int ii=1,jj=1;ii<=eda||jj<=edb;) { if(ii<=eda&&jj<=edb) { if(a[ii].second<b[jj].second)c[++edc]=a[ii].first,ii++; else c[++edc]=b[jj].first,jj++; }else if(ii<=eda)c[++edc]=a[ii].first,ii++; else if(jj<=edb)c[++edc]=b[jj].first,jj++; } eda=0,edb=0; } } } return 0; }View Code
相关文章推荐
- HDU 5818 Joint Stacks(模拟 || 优先队列 || 左式堆)
- HDU 5818 Joint Stacks 模拟
- hdu 5818 Joint Stacks (模拟)
- hdu 5818 Joint Stacks(线段树)
- hdu-5818 Joint Stacks(模拟)
- hdu 5818 Joint Stacks (模拟 技巧)
- HDU 5818 Joint Stacks [栈]【模拟】
- HDU-5818-Joint Stacks-模拟
- HDU 5818 多校第七场 1010 Joint Stacks (线段树)
- HDU 5818 Joint Stacks
- HDU 4262 Juggler (模拟+线段树优化)
- 【set】【HDU 5818】 Joint Stacks
- HDU-5818 多校训练(巧妙模拟)
- hdu 5818 Joint Stacks 优先队列(多校)
- HDU 5818 Joint Stacks (优先队列、链表)
- HDU 5818 2016多校赛第七场 数组模拟链表,来模拟栈
- hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)
- HDU-5475 An easy problem(模拟||(倒着计算+线段树))
- hdu 5818 Joint Stacks 静态链表+栈
- (HDU 5818)2016 Multi-University Training Contest 7 Joint Stacks (模拟、stack)