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; }

浙公网安备 33010602011771号