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

浙公网安备 33010602011771号