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 |
谁能帮忙看下为什么Nlog(N)的时间会超时呢?代码: #include<stdio.h> #include<set> #include<math.h> using namespace std; int s[200005]; void build(int N,int n) { int i,j,k; i=N;j=N+n-1; while(i>1) { for(k=i;k<j;k+=2) s[k>>1]=min(s[k],s[k+1]); if((j&1)==0) s[j>>1]=s[j]; i>>=1;j>>=1; } } struct node { int id,num; }; struct cmp { bool operator ()(node a,node b) { return a.num<b.num; } }; int findx(int l,int r) { int i,j,k; i=k=l;j=r; while(i<=j) { if(s[k]>s[i]) k=i; if(s[k]>s[j]) k=j; if((i&1)==1) i++; if((j&1)==0) j--; i>>=1;j>>=1; } while(k<l) { if(s[k]==s[(k<<1)+1]) k=(k<<1)+1; else k<<=1; } return k; } int main() { int n,i,N,j; while(scanf("%d",&n)==1) { set<node,cmp>set1; set<node,cmp>::iterator it,it2; N=(int)pow(2.0,ceil(log2(n))); for(i=N;i<N+n;i++) scanf("%d",&s[i]); build(N,n); node temp,p; temp.id=N;temp.num=s[N]; set1.insert(temp); int indx,ans=-1; for(i=N+1;i<N+n;i++) { p.id=i;p.num=s[i]; it=set1.upper_bound(p); if(it==set1.end()) j=N; else j=(*it).id+1; if(j<i) { indx=findx(j,i); if(i-indx!=0&&i-indx>ans) ans=i-indx; } set1.insert(p); } printf("%d\n",ans); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator