很容易知道,这个题就是求最大上升子序列。把图画一画就知道了。
如果用经典的DP双重for循环肯定超时。于是从网上搜解题报告才知道是用二分。
于是把 LIS 的二分方法写了一遍。
对二分的思想还是体会不够深啊。
#include<stdio.h>
int num[500010],ans[500010];
int main()
{
int i,n,p,r,cas=1;
int len,lo,hi,mid;
while(~scanf("%d",&n)){
for(i=0;i<n;++i){
scanf("%d%d",&p,&r);
num[p]=r;
}
ans[1]=num[1];
len=1;
for(i=2;i<=n;++i){
lo=1;
hi=len;
while(lo<=hi){
mid=lo+(hi-lo)/2;
if(ans[mid]<num[i]) lo=mid+1;
else hi=mid-1;
}
ans[lo]=num[i];
if(lo>len) ++len;
}
printf("Case %d:\n",cas++);
if(len==1) puts("My king, at most 1 road can be built.");
else printf("My king, at most %d roads can be built.\n",len);
puts("");
}
return 0;
}