ECNUOJ 2149 华丽的队列

华丽的队列

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 }
View Code
原文地址:https://www.cnblogs.com/crackpotisback/p/4633037.html