#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int d[500010];
int result[500010];
int roadNum = 0;
int dp(){
result[1] = d[1];
int index = 1;
for (int k=2;k<=roadNum;k++){
int p = d[k];
int start = 1;
int end = index;
while(start<=end){
int pp = (start + end) / 2;
if(result[pp] > p){
end = pp-1;
}else{
start = pp + 1;
}
}
result[start] = p;
if(start > index) index++;
}
return index;
}
int main()
{
int op = 1;
while(~scanf("%d",&roadNum)) {
memset(d,0,sizeof(d));
memset(result,0,sizeof(result));
int x = 0;
int y = 0;
int k = roadNum;
while(k--) {
scanf("%d%d",&x,&y);
d[x] = y;
}
printf("Case %d:\n",op++);
printf("My king, at most %ld road can be built.\n",dp());
}
return 0;
}
HDU 1025 (DP+二分法)
最新推荐文章于 2020-07-13 10:39:28 发布