2015百度の星1004 KPI STLの妙味

12502 ワード

KPI
Time Limit:20 Sec  メモリLimit:256 MB
タイトル接続
http://acdream.info/problem?pid=1754
Description
あなたが働いてから、KPIはあなたの全部です.サービスを開発して、大きな知名度を得ました.数十億円の要求が大きなパイプに押された後、同時にサービスがパイプから要求を引き出します.各要求には重要な値があると定義しましょう.私のKPIは現在のパイプ内で要求されている重要な値の中間値から計算します.今サービスの記録をあげます.今の配管内で要求されている重要な中間値を知りたいです.
Input
約100セットのデータがあります.
各グループのデータの最初の行はn(1≦n≦10000)であり、サービス記録数を表しています.
次にn行があり、各行には3つの形式の「in x」があります.重要値x(0≦x≦109)を表す要求が進められます.「out」:代表サービスはパイプのヘッドを引っ張って取ってください.「query:代表として、現在の配管内で重要な値を要求する中間値を知りたいです.つまり、現在の配管内にm条の要求があれば、昇順ソート後のflor(m/2)+1 th条の要求の重要な値を知りたいです.
問題を簡単にするために、すべてのxは違っています.そして、パイプ内に値がないと、「out」と「query」の操作はありません.
 
Output
各グループのデータに対して、まず1ライン出力します.
Case〓〓〓はそれから毎回“query”、現在のパイプ内の重要な値の中間値を出力します.
Sample Input
6 in 874 query out in 24622 in 12194 query
Sample Output
Case #1: 874 24622
HINT
 
題意
 
クイズ:
一つのセットで大法を!
コード:
 
//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define test freopen("test.txt","r",stdin)  
#define maxn 2000001
#define mod 10007
#define eps 1e-9
int Num;
char CH[20];
const int inf=0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fLL;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void P(int x)
{
    Num=0;if(!x){putchar('0');puts("");return;}
    while(x>0)CH[++Num]=x%10,x/=10;
    while(Num)putchar(CH[Num--]+48);
    puts("");
}
//**************************************************************************************

queue<ll> q;
set<ll> ss;
ll t,n,mid;
char cmd[100];

void insert(ll x)
{
    ss.insert(x);
    if(mid==-1)
    {
        mid=x;
    }
    else
    {
        if(x>mid)
            if(ss.size()%2==0)
                mid=*ss.upper_bound(mid);
            else
            {
                if(ss.size()%2==1)
                    mid=*(--ss.lower_bound(mid));
            }
    }
    q.push(x);
}
void dequeue()
{
    ll num=q.front();
    q.pop();
    ss.erase(num);
    if(ss.empty())
    {
        mid=-1;
    }
    else
    {
        if(num>mid)
        {
            if(ss.size()%2==1)
                mid=*(--ss.lower_bound(mid));
            else if(num<mid)
            {
                if(ss.size()%2==0)
                    mid=*ss.upper_bound(mid);
            }
            else
            {
                if(ss.size()%2==0)
                    mid=*ss.upper_bound(mid);
                else 
                    mid=*(--ss.lower_bound(mid));
            }
        }
    }
}
void solve()
{
    n=read();
    mid=-1;
    ss.clear();
    while(!q.empty())
        q.pop();
    for(int i=1;i<=n;i++)
    {
        scanf("%s",cmd);
        if(cmd[0]=='i')
        {
            int x=read();
            insert(x);
        }
        if(cmd[0]=='o')
            dequeue();
        if(cmd[0]=='q')
            printf("%lld
",mid); } } int main() { //test; //freopen("1.out","w",stdout); int t=1; for(int cas=1;cas<=t;cas++) { printf("Case #%d:
",cas); solve(); } }