#include <stdio.h>
#include <stdlib.h>
#define N 500000
int buf[N];
int dp[N];
int biSearch(int *arr, int a, int b, int key){
int m;
while(a <= b){
m = a + (b-a)/2;
if(arr[m] < key)
a = m+1;
else
b = m-1;
}
return b;
}
int increaseSeq(int *arr, int *dp, int n){
int i, k, len;
dp[0] = arr[0];
len = 0;
for(i = 1; i < n; ++i){
if(dp[len] < arr[i])
dp[++len] = arr[i];
else
{
k = biSearch(dp, 0, len-1, arr[i]);
dp[k+1] = arr[i];
}
}
return len+1;
}
int main(void){
int i, n, p, r, t = 0, len;
while(scanf("%d", &n)!=EOF){
for(i = 0; i < n; ++i){
scanf("%d%d", &p, &r);
buf[p-1] = r;
}
len = increaseSeq(buf, dp, n);
if(len == 1)
printf("Case %d:\nMy king, at most 1 road can be built.\n\n", ++t);
else
printf("Case %d:\nMy king, at most %d roads can be built.\n\n", ++t, len);
}
return 0;
}
hud1025 最长递增子序列 dp
最新推荐文章于 2023-10-07 16:26:27 发布