思路:
贪心,最长下降子序列 二分。
实现:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <windows.h> 5 const int INF = 0x3f3f3f3f; 6 using namespace std; 7 struct node 8 { 9 int x, y; 10 }; 11 node a[5005]; 12 int d[5005]; 13 bool cmp(const node & a, const node & b) 14 { 15 if (a.x == b.x) 16 return a.y < b.y; 17 return a.x < b.x; 18 } 19 void work(int x, int end) 20 { 21 int l = 1, r = end, m, res = INF; 22 while (l <= r) 23 { 24 m = (l + r) >> 1; 25 if (d[m] <= x) 26 { 27 r = m - 1; 28 } 29 else 30 { 31 res = m; 32 l = m + 1; 33 } 34 } 35 if (res != INF) 36 d[res + 1] = x; 37 else 38 d[1] = x; 39 } 40 int main() 41 { 42 int t, n; 43 cin >> t; 44 while (t--) 45 { 46 cin >> n; 47 for (int j = 0; j < n; j++) 48 scanf("%d %d", &a[j].x, &a[j].y); 49 sort(a, a + n, cmp); 50 int ans = 1; 51 d[1] = a[0].y; 52 for (int i = 1; i < n; i++) 53 { 54 if (a[i].y < d[ans]) 55 d[++ans] = a[i].y; 56 else 57 work(a[i].y, ans-1); 58 } 59 cout << ans << endl; 60 } 61 return 0; 62 }