最长上升子序列的nlogn算法。
#include <iostream>
#include <algorithm>
using namespace std;
int a[500005],ans[500005];
int main()
{
ios::sync_with_stdio(false);
int n,x,y,d=1;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>x>>y;
a[x]=y;
}
ans[1]=a[1];
int len=1;
for(int i=2;i<=n;i++)
{
if(a[i]>ans[len])
ans[++len]=a[i];
else
{
int pos=lower_bound(ans,ans+len,a[i])-ans;
ans[pos]=a[i];
}
}
cout<<"Case "<<d++<<":"<<endl;
if(len==1)
cout<<"My king, at most 1 road can be built."<<endl<<endl;
else
cout<<"My king, at most "<<len<<" roads can be built."<<endl<<endl;;
}
return 0;
}