题意:
河两岸各有n个城市 每个城市可以向对岸建路 建的路不能交叉
问最多可以建多少条路
思路:
可以把模型转化为最长递增子序列
河的一岸作为序列的下标 另一岸作为序列的值
不相交既为 城市i前面的城市不能建比城市i连接的城市后
由于数据比较大 n<500000 n^2版 果断爆 只能用 nlogn 版
坑:
深坑... 输出要分单复数 只能建一条路的时候要输出road而复数要输出roads ..... 不看讨论区 坑到死都不知道怎么死的 = = !
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = 500005;
int n;
int p[maxn],dp[maxn];
int main()
{
//freopen("data.in","r",stdin);
int c,d,cas = 1;
while( scanf("%d",&n) != EOF )
{
for( int i = 1; i <= n; i ++ )
{
scanf("%d%d",&c,&d);
p[c] = d;
}
dp[0] = -1;
int top = 0;
for( int i = 1; i <= n; i ++ )
{
if( p[i] > dp[top] )
dp[++top] = p[i];
else
{
int ld = 1,rd = top,mid;
while( ld <= rd )
{
mid = ( ld + rd )/2;
if( p[i] > dp[mid] )
ld = mid + 1;
else
rd = mid - 1;
}
dp[ld] = p[i];
}
}
if( top == 1 )
printf("Case %d:\nMy king, at most 1 road can be built.\n",cas++);
else
printf("Case %d:\nMy king, at most %d roads can be built.\n",cas++,top);
puts("");
}
return 0;
}