| ||||||||||
| 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 | |||||||||
Re:貌似是这道题的询问多。。我划分树2104 600+ms,这题1800+msIn Reply To:为何我的线段树2104过了,2761却TLE了 Posted by:wmyw961 at 2011-07-06 10:19:07 > #include<iostream>
> #include<cstdio>
> #include<cstring>
> #include<cmath>
> using namespace std;
>
> int T[121][110001];
> int a[110001];
> int n,m;
>
> void buildkth(int dep,int l,int r){
> int mid=(l+r)/2;
> if (l<r){
> buildkth(dep+1,l,mid);
> buildkth(dep+1,mid+1,r);
> }
> else {T[dep][l]=a[l];return;}
>
> //归并
>
> int i=l;int j=mid+1;int k=l-1;
> while (i<=mid || j<=r){
> k++;
>
> if ((i<=mid && T[dep+1][i]<T[dep+1][j]) || j>r){
> T[dep][k]=T[dep+1][i++];
> }
> else
> if ((j<=r && T[dep+1][i]>=T[dep+1][j]) || i>mid){
> T[dep][k]=T[dep+1][j++];
> }
> }
> }
>
> int total(int ll,int rr,int data,int dep,int l,int r){
> if (ll==l && rr==r){
> int x=l;int y=r;int ans=l-1;
> while (x<=y){
> int mid=(x+y)/2;
> if (T[dep][mid]<data){x=mid+1;ans=mid;}
> else y=mid-1;
> }
> return ans-l+1;
> }
> int mid=(l+r)/2;int tot=0;
> if (ll<=mid)
> tot+=total(ll,min(rr,mid),data,dep+1,l,mid);
> if (rr>mid)
> tot+=total(max(ll,(mid + 1)),rr,data,dep+1,mid+1,r);
> return tot;
> }
>
> int findkth(int l1,int r1,int k){
> int l=1;int r=n;
> int ans=1;
> while (l<=r){
> int mid=(l+r)/2;
> int xp=total(l1,r1,T[0][mid],0,1,n);
> if (xp<=k){
> ans=mid;
> l=mid+1;
> }
> else r=mid-1;
> }
> return T[0][ans];
> }
>
> int main(){
>
> scanf("%d%d",&n,&m);
> for (int i=1;i<=n;i++)
> scanf("%d",&a[i]);
>
> buildkth(0,1,n);
>
> int l,r,k;
> for (int i=1;i<=m;i++){
> scanf("%d%d%d",&l,&r,&k);
> printf("%d\n",findkth(l,r,k-1));
> }
> }
>
>
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator