题目链接:
The Famous ICPC Team AgainTime Limit: 30000/15000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Moreover, when collecting the problems, Mr. B had also known an estimation of each problem’s difficultness. When he was asked to choose a problem, if he chose the easiest one, Mr. G would complain that “Hey, what a trivial problem!”; if he chose the hardest one, Mr. M would grumble that it took too much time to finish it. To address this dilemma, Mr. B decided to take the one with the medium difficulty. Therefore, he needed a way to know the median number in the given interval of the sequence.
/* 4251 873MS 16072K 1722 B G++ 2014300227 */ #include <bits/stdc++.h> using namespace std; const int N=1e5+4; typedef long long ll; int n,m,a[N],sorted[N],k; int tree[32][N],num[32][N]; void build(int dep,int l,int r) { if(l>=r)return ; int mid=(l+r)>>1; int lp=l,rp=mid+1,sum=mid-l+1; for(int i=l;i<=r;i++) { if(tree[dep][i]<sorted[mid])sum--; } for(int i=l;i<=r;i++) { if(i!=l)num[dep][i]=num[dep][i-1]; else num[dep][i]=0; if(tree[dep][i]<sorted[mid]) { tree[dep+1][lp++]=tree[dep][i]; num[dep][i]++; } else if(tree[dep][i]==sorted[mid]&&sum>0) { tree[dep+1][lp++]=tree[dep][i]; num[dep][i]++; sum--; } else { tree[dep+1][rp++]=tree[dep][i]; } } build(dep+1,l,mid), build(dep+1,mid+1,r); } int query(int dep,int l,int r,int ql,int qr,int k) { if(l>=r)return tree[dep][l]; int mid=(l+r)>>1,s,ss; if(l!=ql) s=num[dep][ql-1],ss=num[dep][qr]-num[dep][ql-1]; else s=0,ss=num[dep][qr]; if(k<=ss)return query(dep+1,l,mid,l+s,l+s+ss-1,k); else return query(dep+1,mid+1,r,mid+1+ql-l-s,mid+1+qr-l-s-ss,k-ss); } int main() { int cnt=1; while(scanf("%d",&n)!=EOF) { printf("Case %d:\n",cnt++); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sorted[i]=tree[0][i]=a[i]; } sort(sorted+1,sorted+n+1); scanf("%d",&m); build(0,1,n); int l,r; for(int i=0;i<m;i++) { scanf("%d%d",&l,&r); printf("%d\n",query(0,1,n,l,r,(r-l+2)/2)); } } return 0; }