xmu 1317

http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1317

题意:对于一个集合S,定义三种操作:

1.加入一个数n;

2.删除一个数n;

3.查询第k大的数。 

解法:树状数组 + map。

View Code
#include<stdio.h>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<string.h>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x)&(-x)
using namespace std;
const long long N = 100005;

struct nd
{
        long long id,op;
}bs[N];
int stat[N],sum[N];
long long aas[N],as[N];
void update(long long x,int val,long long n){ for(;x<=n;x+=lowbit(x))sum[x]+=val; }
long long findk(long long x,long long n)
{
        long long pos = 0,cnt = 0;
        for(int i = 18; i >= 0; -- i)
        {
                pos += (1<<i);
                if(pos>n||cnt+sum[pos]>=x) pos -= (1<<i);
                else cnt += sum[pos];
        }
        return pos + 1;
}
int main()
{
        long long i,j,t,n,m,k;
        map<long long,long long>as;
        map<string,long long>ds;
        map<string,long long>::iterator pos;
        while(scanf("%lld",&t)==1)
        {
                k = 0;
                as.clear();
                ds.clear();
                char str[20],str2[10];
                for(i = 0; i < t; ++ i){
                        scanf("%s %lld",str2,&bs[i].id);
                        bs[i].op = str2[0];
                        sprintf(str,"%lld",bs[i].id);
                        ds[str] = bs[i].id;
                }
                for(pos = ds.begin(); pos != ds.end(); ++ pos){
                        ++k; aas[k] = pos->second; as[aas[k]] = k;
                }
                memset(stat,0,sizeof(stat));
                memset(sum,0,sizeof(sum));
                n = 0;
                for(i = 0; i < t; ++ i){
                        j = as[bs[i].id];
                        if(bs[i].op=='n'){
                                if(stat[j])printf("already exist %lld\n",bs[i].id);
                                else{ ++n; update(j,1,k); stat[j] = 1; }
                        }else if(bs[i].op=='l'){
                                if(stat[j]){ stat[j] = 0; update(j,-1,k); --n; }
                                else printf("not exist %lld\n",bs[i].id);
                        }else{
                                m = bs[i].id;
                                if(m>n)puts("none");
                                else { m = findk(n-m+1,k); printf("%lld\n",aas[m]);}
                        }
                }
        }return 0;
}

posted on 2012-06-12 17:44  aigoruan  阅读(153)  评论(0)    收藏  举报

导航