华丽的队列
Time Limit:3000MS Memory Limit:65536KB
Total Submit:531 Accepted:68
Description
每年,都有很多新同学来到我们学校,最近,我们学校的领导为了考验新同学的能力,想出了一个方法来测试:
领导们定义了一个队列,队列中的元素是顺序存放的,领导们还定义了队列的几种操作:
a) insert x ,向队列末尾添加一个元素x
b) delete ,删除队列前的第一个元素
c) MinElement 删除队列中的最小元素
HINT:
1.insert的元素x(0<=x<=1000000)
2.队列中的元素是唯一的,不会出现重复元素
3.对于每组测试数据,操作的数量(0<=op<=50000)
Input
首先一个正整数N,代表操作的数量:
接下来从2到N+1行:
每行开始一个字符串s,有3种字符串: insert , delete 或者 MinElement
对于insert 接下来有个整数x,代表插入队列的元素
对于delete ,删除队首的元素
对于MinElement , 返回队列中的最小元素,并且把这个元素从队列中删除
Output
对于每个操作,输出不同的答案:
对于insert ,输出队列中元素的总数n
对于delete ,删除队首的元素,并且输出这个队首元素x
对于MinElement , 输出队列中的最小元素x.并且把这个元素从队列中删除
Sample Input
6
insert 1
insert 2
insert 3
insert 4
delete
MinElement
Sample Output
1
2
3
4
1
2
Source
解题:没找到别的方法,只好强行上线段树了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 200010; 4 const int INF = 0x3f3f3f3f; 5 struct node { 6 int lt,rt,minv; 7 } tree[maxn<<2]; 8 int ret; 9 void build(int lt,int rt,int v) { 10 tree[v].lt = lt; 11 tree[v].rt = rt; 12 tree[v].minv = INF; 13 if(lt == rt) return; 14 int mid = (lt + rt)>>1; 15 build(lt,mid,v<<1); 16 build(mid+1,rt,v<<1|1); 17 } 18 void update(int lt,int rt,int v,int val) { 19 if(lt <= tree[v].lt && rt >= tree[v].rt) { 20 ret = tree[v].minv; 21 tree[v].minv = val; 22 return ; 23 } 24 if(lt <= tree[v<<1].rt) update(lt,rt,v<<1,val); 25 if(rt >= tree[v<<1|1].lt) update(lt,rt,v<<1|1,val); 26 tree[v].minv = min(tree[v<<1].minv,tree[v<<1|1].minv); 27 } 28 int head(int v) { 29 if(tree[v].lt == tree[v].rt) { 30 return tree[v].lt; 31 } 32 if(tree[v<<1].minv < INF) return head(v<<1); 33 if(tree[v<<1|1].minv < INF) return head(v<<1|1); 34 } 35 int tail(int v) { 36 if(tree[v].lt == tree[v].rt) return tree[v].lt; 37 if(tree[v<<1|1].minv < INF) return tail(v<<1|1); 38 if(tree[v<<1].minv < INF) return tail(v<<1); 39 } 40 int themin(int v) { 41 if(tree[v].lt == tree[v].rt) return tree[v].lt; 42 if(tree[v<<1].minv < tree[v<<1|1].minv) return themin(v<<1); 43 if(tree[v<<1|1].minv < tree[v<<1].minv) return themin(v<<1|1); 44 } 45 int main() { 46 int m,val,siz = 0,h; 47 char op[20]; 48 scanf("%d",&m); 49 build(0,200000,1); 50 while(m--) { 51 scanf("%s",op); 52 if(op[0] == 'i') { 53 scanf("%d",&val); 54 if(siz == 0) { 55 update(100000,100000,1,val); 56 } else { 57 h = tail(1); 58 update(h+1,h+1,1,val); 59 } 60 siz++; 61 printf("%d ",siz); 62 } else if(op[0] == 'd') { 63 h = head(1); 64 update(h,h,1,INF); 65 printf("%d ",ret); 66 siz--; 67 } else if(op[0] == 'M') { 68 h = themin(1); 69 update(h,h,1,INF); 70 printf("%d ",ret); 71 siz--; 72 } 73 } 74 return 0; 75 }