从下面的城市向上面的城市连线,要求路不能交叉,画图就知道了,一顺边的路最多,最大上升子序列
事实告诉我们,没事不要cout和cin,TLE半天,以为下界求错了。。。
只需要长度,没必要多开一个数组记录路径
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn= 500000+5;
int d[maxn];
int road[maxn];
int bisearch(int l,int r,int a){
while(l<=r){
int mid=(l+r)/2;
if(a>d[mid])l=mid+1;
else r=mid-1;
}
return l;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,p,r,len;
int c=1;
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%d%d",&p,&r);
road[p]=r;
}
len=1;
d[0]=-1;
d[1]=road[1];
for(int i=2;i<=n;++i){
int j=bisearch(1,len,road[i]);
d[j]=road[i];
if(j>len)len++;
}
printf("Case %d:\n",c++);
if(len==1)
printf("My king, at most %d road can be built.\n\n",len);
else
printf("My king, at most %d roads can be built.\n\n",len);
}
return 0;
}