/*
* 最长非递增序列变形
* 需要注意的是O(n^2)的算法不能过, 需要O(nlogn)的算法
* The longest non-increasing sequence deformation
* Is O (n ^ 2) algorithm can not be too, needs O (nlogn) algorithm
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 500001
typedef struct $ {
int poor, rich;
}Pair;
Pair p[MAXN];
int ans[MAXN], pos;
int cmp(const Pair &a, const Pair &b)
{
return a.poor < b.poor;
}
void binary_insert(int x)
{
if( x > ans[pos-1] ) {
ans[pos ++] = x; return ;
}
int l(0), r(pos-1), m;
while( l <= r ) {
m = (l+r)>>1;
if( ans[m] > x ) {
r = m-1;
}
else if( ans[m] < x ) {
l = m+1;
}
}
if( l < pos && ans[l] > x ) {
ans[l] = x;
}
else if( r >= 0 && ans[r] > x ) {
ans[r] = x;
}
}
int dynamic_programming(int n)
{
pos = 0;
ans[pos ++] = p[0].rich;
for(int i = 1; i < n; i ++) {
binary_insert(p[i].rich);
}
return pos;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n, cnt(1), val;
while( ~scanf("%d", &n) ) {
for(int i = 0; i < n; i ++) {
scanf("%d %d", &p[i].poor, &p[i].rich);
}
sort(p, p+n, cmp);
val = dynamic_programming(n);
printf("Case %d:\n", cnt ++);
if( 1 == val ) {
printf("My king, at most 1 road can be built.\n\n");
}
else {
printf("My king, at most %d roads can be built.\n\n", val);
}
}
return 0;
}
hdu_1025
最新推荐文章于 2025-11-25 00:04:22 发布
347

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



