标签:cep blog min namespace uil follow ast include logs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6077 Accepted Submission(s): 2645
#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; long long ans; struct P_Tree { int n; int tree[20][N]; int sorted[N]; int toleft[20][N]; ll sum[N]; ll lsum[20][N]; void init(int len) { n=len; sum[0]=0; for(int i=0; i<20; i++)tree[i][0]=toleft[i][0]=lsum[i][0]=0; for(int i=1; i<=n; i++) { scanf("%d",&sorted[i]); tree[0][i]=sorted[i]; sum[i]=sum[i-1]+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]; lsum[dep][i] = lsum[dep][i-1] + tree[dep][i]; } else if(tree[dep][i] == sorted[mid] && same > 0) { tree[dep+1][lpos++] = tree[dep][i]; lsum[dep][i] = lsum[dep][i-1] + tree[dep][i]; same --; } else { tree[dep+1][rpos++] = tree[dep][i]; lsum[dep][i] = lsum[dep][i-1]; } toleft[dep][i] = toleft[dep][l-1] + lpos -l; } 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]; int s=toleft[dep][l-1]-toleft[dep][L-1]; if(cnt>=k) { 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);//×¢òa } else { ans+=(ll)(lsum[dep][r]-lsum[dep][l-1]); //printf("l: %d r: %d ans: %lld %lld %lld\n",l,r,ans,lsum[dep][r],lsum[dep][l-1]); 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);//×¢òa } } } tre; int main() { int iCase=0; int n,m,k,T; int l,r,h; scanf("%d\n",&T); while(T--) { scanf("%d%d",&n,&m); tre.init(n); printf("Case %d:\n",++iCase); while(m--) { int Ans=0; ans=0; scanf("%d%d%d",&l,&r,&h); l++; r++; int ll=1,rr=(r-l)+1; while(rr-ll>=0){ k=(rr+ll)/2; int res=tre.query(1,n,l,r,0,k); if(res>h)rr=k-1; else { Ans=k; ll=k+1; } //printf("l: %d r: %d k: %d ans: %d\n",l,r,k,Ans);system("pause"); } printf("%d\n",Ans); } } return 0; }
HDU 4417 Super Mario (划分树)(二分)
标签:cep blog min namespace uil follow ast include logs
原文地址:http://www.cnblogs.com/jianrenfang/p/6370439.html