最长上升子序列的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;
}
本文深入解析了最长上升子序列的nlogn算法,通过具体实例和代码实现,详细阐述了算法的核心思想和应用过程,旨在帮助读者理解和掌握这一经典算法。

被折叠的 条评论
为什么被折叠?



