Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1440 Accepted Submission(s): 708
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define lson(x) ((x<<1)) #define rson(x) ((x<<1)+1) using namespace std; typedef long long ll; const int N=1e5+50; const int M=N*N+10; struct P_Tree { int n; int tree[20][N]; int sorted[N]; int toleft[20][N]; void init(int len) { n=len; for(int i=0; i<20; i++)tree[i][0]=toleft[i][0]=0; for(int i=1; i<=n; i++) { scanf("%d",&sorted[i]); tree[0][i]=sorted[i]; } sort(sorted+1,sorted+n+1); build(1,n,0); } void build(int l,int r,int dep) { if(l==r)return; int mid=(l+r)>>1; int same=mid-l+1; for(int i=l; i<=r; i++) if(tree[dep][i]<sorted[mid]) same--; int lpos=l; int rpos=mid+1; for(int i=l; i<=r; i++) { if(tree[dep][i]<sorted[mid]) { //去左边 tree[dep+1][lpos++]=tree[dep][i]; } else if(tree[dep][i]==sorted[mid]&&same>0) { //去左边 tree[dep+1][lpos++]=tree[dep][i]; same--; } else //去右边 tree[dep+1][rpos++]=tree[dep][i]; toleft[dep][i]=toleft[dep][l-1]+lpos-l;//从1到i放左边的个数 } build(l,mid,dep+1);//递归建树 build(mid+1,r,dep+1); } int query(int L,int R,int l,int r,int dep,int k) { if(l==r)return tree[dep][l]; int mid=(L+R)>>1; int cnt=toleft[dep][r]-toleft[dep][l-1]; if(cnt>=k) { //L+查询区间前去左边的数的个数 int newl=L+toleft[dep][l-1]-toleft[dep][L-1]; //左端点+查询区间会分入左边的数的个数 int newr=newl+cnt-1; return query(L,mid,newl,newr,dep+1,k);//注意 } else { //r+区间后分入左边的数的个数 int newr=r+toleft[dep][R]-toleft[dep][r]; //右端点减去区间分入右边的数的个数 int newl=newr-(r-l-cnt); return query(mid+1,R,newl,newr,dep+1,k-cnt);//注意 } } }tre; int main() { int iCase=0; int n,m; int u,v; while(~scanf("%d",&n)) { tre.init(n); scanf("%d",&m); printf("Case %d:\n",++iCase); while(m--) { scanf("%d%d",&u,&v); int k=(v-u)/2+1; printf("%d\n",tre.query(1,n,u,v,0,k)); } } return 0; }
HDU 4251 The Famous ICPC Team Again(划分树)
原文:http://www.cnblogs.com/jianrenfang/p/6363816.html