Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
想学着大牛们思路写……WA了……大牛们有空给抓抓BUG好么……#include "iostream" #include "string.h" #include "stdio.h" using namespace std; int mmmm[20][10010]; int data[10010]; struct node { int l,r; node operator += (const node& other) { l+=other.l; r+=other.r; return *this; } }; class tree { public: tree() {} void build(int n) { build(0,1,n,0); } node count(int k,const int& l,const int& r,const int& key,int depth) { node ans; if(a[k].l==a[k].r) { ans.l=0; ans.r=0; if(mmmm[depth][a[k].l]<key) ans.l++; else if(mmmm[depth][a[k].l]>key) ans.r++; } else if(a[k].l>=l&&a[k].r<=r) { if(mmmm[depth][a[k].r]<key) { ans.l=a[k].r-a[k].l+1; ans.r=0; return ans; } if(mmmm[depth][a[k].l]>key) { ans.r=a[k].r-a[k].l+1; ans.l=0; return ans; } int ll=a[k].l,rr=a[k].r; int m; while(ll<rr) { m=(ll+rr)>>1; if(mmmm[depth][m]<key&&mmmm[depth][m+1]>=key) { ll=m; break; } else if(mmmm[depth][m]>=key) rr=m; else ll=m+1; } if(mmmm[depth][ll]<key) ans.l=ll-a[k].l+1; else ans.l=ll-a[k].l; rr=a[k].r; while(ll<rr) { m=(ll+rr)>>1; if(mmmm[depth][m]<=key&&mmmm[depth][m+1]>key) { rr=m+1; break; } else if(mmmm[depth][m]>key) rr=m-1; else ll=m+1; } if(mmmm[depth][rr]>key) ans.r=a[k].r-rr+1; else ans.r=a[k].r-rr; } else { ans.l=ans.r=0; int m=(a[k].l+a[k].r)>>1; if(l<=m) ans+=count(lson(k),l,r,key,depth+1); if(r>m) ans+=count(rson(k),l,r,key,depth+1); } return ans; } private: void build(int k,int l,int r,int d) { a[k].l=l; a[k].r=r; if(l==r) { mmmm[d][l]=data[l]; } else { int ls=lson(k),rs=rson(k),m=(l+r)>>1; build(ls,l,m,d+1); build(rs,m+1,r,d+1); int i=l,j=m+1,k=l; while(i<=m&&j<=r) { if(mmmm[d+1][i]<=mmmm[d+1][j]) mmmm[d][k++]=mmmm[d+1][i++]; else mmmm[d][k++]=mmmm[d+1][j++]; } while(i<=m) mmmm[d][k++]=mmmm[d+1][i++]; while(j<=r) mmmm[d][k++]=mmmm[d+1][j++]; } } inline int lson(int i) { return (i<<1)+1; } inline int rson(int i) { return (i<<1)+2; } inline int father(int i) { return (i-1)>>1 ; } node a[270000]; }ttt; int main() { int n,m,a,b,k,l,r,mid,len; node c; cin>>n>>m; int i,j; for(i=1;i<=n;i++) { get(data[i]); } ttt.build(n); for(;m;--m) { scanf("%d%d%d",&a,&b,&k); l=1; r=n; k--; len=b-a; while(l<r) { mid=(l+r)>>1; c=ttt.count(0,a,b,mmmm[0][mid],0); if(c.l==k&&c.l+c.r==len) { l=mid; break; } else if(c.l<k||c.r>len-k) l=mid+1; else r=mid-1; } printf("%d\n",mmmm[0][l]); } //system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator