zoukankan      html  css  js  c++  java
  • 黑匣子

    黑匣子

    Description

    我们使用黑匣子的一个简单模型。它能存放一个整数序列和一个特别的变量i。在初始时刻,黑匣子为空且i等于0。这个黑匣子执行一系列的命令。有两类命令:
    (1)ADD(x):把元素x放入黑匣子;
    (2)GET:i增1的同时,输出黑匣子内所有整数中第i小的数。
    牢记第i小的数是当黑匣子中的元素以非降序排序后位于第i位的元素(输入数据保证每次GET命令中第i小的数必存在)

    Input

    输入的第1行只有一个整数n,表示有n条命令. 第2行至第n+1行,每行一条命令.

    Output

    输出中有若干行内容,每行一个整数,表示相应的get命令的输出.

    Sample Input

    11
    ADD(3)
    GET
    ADD(1)
    GET
    ADD(-4)
    ADD(2)
    ADD(8)
    ADD(-1000)
    GET
    GET
    ADD(2)
    

    Sample Output

    3
    3
    1
    2
    

    HINT

    对30%的数据,1≤n≤50000; 对100%的数据,1≤n≤500000; 对所有的数据,ADD命令输入的数在-10000至10000之间;

    Source

    #include<bits/stdc++.h>
    using namespace std;
    int s1[500001], s2[500001], len1 = 0,len2 = 0;
    void s1_up(int p)
    {
        while(p>1&&s1[p/2]>s1[p])
        {
            swap(s1[p/2],s1[p]);
            p=p/2;
        }
        return;
    }
    void s1_down(int p)
    {
        int lt;
        while(1)
        {
            if(p*2>len1) return;
            if(p*2==len1) lt=p*2;
            else
            {
                if(s1[p*2]<s1[p*2+1]) 
                lt=p*2;
                else
                lt=p*2+1;
            }
            if(s1[p]>s1[lt])
            {
                swap(s1[p],s1[lt]);
                p=lt;
            }
            else break;
        }
        return;
    }
    void s1_insert(int key)
    {
        s1[++len1]=key;
        s1_up(len1);
    }
    void s2_up(int p)
    {
        while(p>1&&s2[p/2]<s2[p])
        {
            swap(s2[p/2],s2[p]);
            p=p/2;
        }
        return;
    }
    void s2_down(int p)
    {
        int lt;
        while(1)
        {
            if(p*2>len2) return;
            if(p*2==len2) lt=p*2;
            else
            {
                if(s2[p*2]>s2[p*2+1]) 
                lt=p*2;
                else
                lt=p*2+1;
            }
            if(s2[p]<s2[lt])
            {
                swap(s2[p],s2[lt]);
                p=lt;
            }
            else break;
        }
        return;
    }
    void s2_insert(int key)
    {
        s2[++len2]=key;
        s2_up(len2);
    }
    int main()
    {
        int n;
        cin>>n;
        char tmp[10];
        gets(tmp);
        int k=1;
        for(int i=1;i<=n;i++)
        {
            char c;
            scanf("%c",&c);
            if(c=='A')
            {
                int x;
                scanf("DD(%d)",&x);
                gets(tmp);
                if(x<s2[1]) s2_insert(x);
                else s1_insert(x);
            }
            else
            {
                gets(tmp);
                while(len2<k)
                {
                    int x=s1[1];
                    s1[1]=s1[len1--];
                    s1_down(1);
                    s2_insert(x);
                }
                while(len2>k)
                {
                    int x=s2[1];
                    s2[1]=s2[len2--];
                    s2_down(1);
                    s1_insert(x);
                }
                printf("%d
    ",s2[1]);
                k++;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    协程,纤程(Fiber),或者绿色线程(GreenThread)
    好用的 Chrome 插件
    内存泄露
    Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录
    ES6-类(Class)
    规范-Git打标签与版本控制
    必会必知git
    Ubuntu 16.04安装CrossOver容器来安装QQ(终极解决办法,亲测有效)
    Ubuntu 16.04安装UML工具StarUML 2
    Ubuntu 16.04升级4.7.0内核后导致Compiz奔溃,问题:compiz[4852]: segfault at 48 ip 00007f88cae087f0 sp 00007ffce354c268 error 4 in libscale.so
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12079278.html
Copyright © 2011-2022 走看看