• 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
  • 相关阅读:
    将WindowXP系统变为正版的方法(有序列号)
    关于在vs2005下的gridview中去掉style属性中的bordercollapse:collapse;的方法
    推荐一款视频播放器射手播放器
    Thinking in C++ 下载
    session丢失、不起作用的一种情况和一种解决
    CSS控制文字长度
    让Windows XP自动登陆[摘抄]
    奇虎360安全卫士中带的卡巴斯基v6.0的一宗罪
    出现Server Application Unavailable的又一种解决办法
    Lucene.net搜索结果排序(单条件和多条件)
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4633037.html
Copyright © 2020-2023  润新知