这个题很明显了。
两条线段不相交,就是 在 一边排序之后 另一边求最大上升子序列。
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAXN 500000+10
#define INF 1 << 30
struct Road{
int we;
int sp;
friend bool operator < (Road a, Road b){
return a.we < b.we;
}
};
int d[MAXN];
int g[MAXN];
Road s[MAXN];
int main (){
int x,y;
int kase = 0;
int n;
while(scanf("%d", &n) != EOF){
memset(s,0,sizeof(s));
for(int i = 0; i < n; i++)
scanf("%d%d",&s[i].we,&s[i].sp);
sort(s,s+n);
int M = 0;
for(int i = 0; i <= n; i++)
d[i] = 1;
for(int i = 0; i <= n; i++)
g[i] = INF;
int ans = 0;
for(int i = 0; i < n; i++){
int k = lower_bound(g+1, g+n+1, s[i].sp) - g;
d[i] = k; // 到 i 这个数的时候 前面有多少个数。
g[k] = s[i].sp;
ans = max(ans, d[i]);
}
printf("Case %d:\n", ++kase);
if(ans == 1)
printf("My king, at most %d road can be built.\n\n",ans);
else
}
return 0;
}