最长上升子序列:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=500005;
int a[maxx],p[maxx];
int n;
int len;
int find(int x){
int left=1,right=len;
int mid;
while(left<=right){
mid=(left+right)>>1;
if(x>p[mid]){
left=mid+1;
}else{
right=mid-1;
}
}
return left;
}
int main(){
int count=1;
while(cin>>n){
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
for(int i=0;i<n;i++){
int ax,b;
cin>>ax>>b;
a[ax]=b;
}
p[1]=a[1];
len=1;
for(int i=2;i<=n;i++){
if(a[i]>p[len]){
p[++len]=a[i];
}else{
int j=find(a[i]);
p[j]=a[i];
}
}
cout<<"Case "<<count++<<":"<<endl;
if(len==1){
cout<<"My king, at most "<<len<<" road can be built."<<endl;
}else{
cout<<"My king, at most "<<len<<" roads can be built."<<endl;
}
cout<<endl;
}
return 0;
}