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;
}
浙公网安备 33010602011771号