hdu5249(权值线段树)

离散化后维护  

离散化,一种是给定的数据已经各不相同了,就直接记录(如普通的线段树题hdu1255),,,另一种是可能会相同就用unique() 去重~~~

ac代码:

#include <iostream>
#include<stdio.h>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<functional>
#include<utility>
#include<string>
#include<string.h>
#include<vector>
#include<iomanip>
#include<stack>
#include<queue>
#include<set>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define Max(a,b) a=max(a,b)
#define Min(a,b) a=min(a,b)
const int inf=0x3f3f3f3f;
#define siz 10010
int n,tr[siz<<2],num[siz],disc[siz],cnt; //discrete 离散化  cnt表离散化后的点数
void init()
{
    memset(num,0,sizeof(num));
    memset(tr,0,sizeof(tr));
}
void PushUp(int u)
{
    tr[u]=tr[u<<1]+tr[u<<1|1];
}
void update(int u,int l,int r,int key,int flag)
{
    if(l==r){tr[u]+=flag;return;}
    int mid=(l+r)>>1;
    if(key<=mid)update(u<<1,l,mid,key,flag);
    if(key>mid)update(u<<1|1,mid+1,r,key,flag);
    PushUp(u);
}
int query(int u,int l,int r,int ord)
{
    if(l==r)return disc[l];
    int mid=(l+r)>>1;
    if(tr[u<<1]>=ord)return query(u<<1,l,mid,ord);
    else return query(u<<1|1,mid+1,r,ord-tr[u<<1]);
}

int main()
{
    std::ios::sync_with_stdio(false);
    int cas=0;
    while(scanf("%d",&n)!=EOF){
        init();
        queue<int>q;
        cas++;
        printf("Case #%d:\n",cas);
        char s[10];
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            if(s[0]=='i')scanf("%d",&num[i]);
            else if(s[0]=='o')num[i]=-1;
            else if(s[0]=='q')num[i]=-2;
        }
        cnt=0;
        for(int i=1;i<=n;i++)if(num[i]>=0)disc[++cnt]=num[i];
        sort(disc+1,disc+1+cnt);
        unique(disc+1,disc+1+cnt);
        for(int i=1;i<=n;i++){
            if(num[i]>=0){
                int tmp=lower_bound(disc+1,disc+1+cnt,num[i])-(disc);
                update(1,1,cnt,tmp,1);
                q.push(tmp);
            }
            else if(num[i]==-1){
                int ret=q.front();q.pop();
                update(1,1,cnt,ret,-1);
            }
            else {
                int md=query(1,1,cnt,q.size()/2+1);
                printf("%d\n",md);
            }
        }
    }

    return 0;
}

 

posted @ 2018-07-20 16:21  WindFreedom  阅读(333)  评论(0)    收藏  举报