黑匣子

AQS系列(六)- Semaphore的使用及原理

黑匣子

Description

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

Input

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

[系列] Go 使用 defer 函数 要注意的几个点

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\n",s2[1]);
            k++;
        }
    }
    return 0;
}

布隆过滤器总结

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享