公共递增子序列,但是需要 O(n*logn) 的算法! 特别注意: 若是答案是1 是 road, 大于1 是roads #include <iostream> using namespace std; #define inf INT_MAX int a[500001]; int b[500001]; int t; void f(int from, int to, int x) { int mid = (from + to) / 2; if(a[x] < b[mid]) { if(a[x] > b[mid-1]) { b[mid] = a[x]; } else { f(from, mid-1, x); } } else { if(a[x] < b[mid+1]) { b[mid+1] = a[x]; if(mid == t) t++; } else { f(mid+1, to, x); } } } int main() { int n, ii = 1; while(scanf("%d", &n) != EOF) { int x, y; for(int i = 1; i <= n; i++) { scanf("%d %d", &x, &y); a[x] = y; b[i] = inf; } t = 0; b[0] = 0; for(int i = 1; i <= n; i++) { f(0, t, i); } printf("Case %d:/n", ii++); if(t == 1) printf("My king, at most %d road can be built./n/n", t); else printf("My king, at most %d roads can be built./n/n", t); } return 0; }