zoukankan      html  css  js  c++  java
  • L3-002 特殊堆栈 (30 分) 模拟stl

      

    堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。

    输入格式:

    输入的第一行是正整数 N(≤)。随后 N 行,每行给出一句指令,为以下 3 种之一:

    Push key
    Pop
    PeekMedian
    

    其中 key 是不超过 1 的正整数;Push 表示“入栈”;Pop 表示“出栈”;PeekMedian 表示“取中值”。

    输出格式:

    对每个 Push 操作,将 key 插入堆栈,无需输出;对每个 Pop 或 PeekMedian 操作,在一行中输出相应的返回值。若操作非法,则对应输出 Invalid

    输入样例:

    17
    Pop
    PeekMedian
    Push 3
    PeekMedian
    Push 2
    PeekMedian
    Push 1
    PeekMedian
    Pop
    Pop
    Push 5
    Push 4
    PeekMedian
    Pop
    Pop
    Pop
    Pop
    

    输出样例:

    Invalid
    Invalid
    3
    2
    2
    1
    2
    4
    4
    5
    3
    Invalid

    用两个vector 一个维护栈 一个维护中值
    char 比string真的快了很多很多!!!!! 如果遇到大规模的题用char快
    还有个就是用lowbound 而不是用find的细节
    要在vector里lowbound 用迭代器来接收地址
    erase(it) it也是迭代器
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 1020
    
    
    int main()
    {   
        vector<int>v;
        vector<int>v2;
        int n;
        RI(n);
        char str[20];
        vector<int>::iterator it;
        while(n--)
        {
            RS(str);//这里用char 比string类型的快了100ms   读写真的影响很大
            if(str[1]=='u')
            {
                int x;
                RI(x);
                v.push_back(x);
                it=lower_bound(v2.begin(),v2.end(),x);
                v2.insert(it,x);
            }
            else if(str[1]=='o')
            {
                if(!v.size())printf("Invalid
    ");
                else
                {
                cout<< v[ v.size()-1 ]<<endl;
                it=lower_bound(v2.begin(),v2.end(),v[v.size()-1] );//这里用lowbound比find 快很多  因为已经排序好了
                v2.erase(it);
                v.pop_back();
                }
            }
            else
            {
                if(!v.size())printf("Invalid
    ");
                else
                printf("%d
    ",v2[ (v2.size()-1)/2]);
            }
        }
       return 0;
    }
    View Code




  • 相关阅读:
    线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
    线程的创建,pthread_create,pthread_self,pthread_once
    线程和进程的关系
    改变进程的优先级,nice,getpriority,setpriority
    setuid和setgid
    等待进程结束wait,waitpid
    执行新程序以及环境变量
    进程退出exit、_exit、abort
    VBA 判断单元格是否为公式,可用于数组
    ADODB 调用存储过程
  • 原文地址:https://www.cnblogs.com/bxd123/p/10620645.html
Copyright © 2011-2022 走看看