poj 1609

题意:抽象的说,就是给出一列数对 ,求出其最长的递增序列的长度。

用偏序定理,再LIS(nlogn).

代码:

#include<iostream>
#include<fstream>

using namespace std;
int n;

struct e{
	int s,t;
};
e a[10001];

int cmp(const void *a,const void *b){
	e *s=(e*)a;
	e *t=(e*)b;
	if(s->s!=t->s)
		return s->s-t->s;
	else
		return s->t-t->t;
}
 
int b[10001];

int find(int s,int value){
    int i=0,k;
    while(i<=s)
    {
        k=(i+s)>>1;
        if(b[k]>value) s=k-1;
        else i=k+1;
    }
    return s;
}



void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	
	while(cin>>n){
		if(n==0) break;
	for(i=0;i<n;i++)
		cin>>a[i].s>>a[i].t;
	qsort(a,n,sizeof(e),cmp);
	
		
      int  m=0;
        b[0]=a[0].t;
        for(i=1;i<n;i++)
        {
            j=find(m,a[i].t);
            b[j+1]=a[i].t;
            if(j+1>m) m=j+1;
        }
         
	cout<<m+1<<endl;

	}
	cout<<'*'<<endl;
         
}
 



int main(){
	read();
	return 0;
}

posted on 2011-05-04 18:06  宇宙吾心  阅读(468)  评论(0)    收藏  举报

导航