包子的旷野吧 关注:9贴子:209
  • 2回复贴,共1

[程序] 最长不下降序列 [二分优化版 O(nlogn)]

只看楼主收藏回复

/*
 LIS within O(nlogn)
 Program by Alex
 2007-09-02 21:30
*/

#include <stdio.h>

#define maxn 10000+1

int minval[maxn],list[maxn],d[maxn];

int n;

int find(int a,int b,int v){
 if(a==b) return a;
 int mid=(a+b)/2;
 if(v<=minval[mid]) return find(a,mid,v);
 return find(mid+1,b,v);
}

int main(){
 freopen("lis.in","r",stdin);
 freopen("lis.out","w",stdout);
 scanf("%d",&n);
 int i;
 for(i=1;i<=n;i++)
  scanf("%d",&list[i]);
 for(i=1;i<=n;i++)
  minval[i]=0x7fffffff;
 int prelength,best;
 for(i=1;i<=n;i++){
  prelength=find(1,i,list[i]);
  d[i]=prelength+1;
  minval[d[i]]=list[i];
  if(d[i]>best) best=d[i];
 }
 printf("%d",best);
 return 0;
}


IP属地:浙江1楼2007-09-02 21:07回复
    尚未测试,不过应该是对的

    正确的情况下应该能AC掉maxn=10000的数


    IP属地:浙江2楼2007-09-02 21:09
    回复
      好像错了,minval[d[i]]=list[i]; 前 加上if(minval[d[i]]>list[i]);


      IP属地:安徽3楼2010-06-25 17:16
      回复