toj 4071 最长不下降子序列

题目描述:给出2D空间中的n只鸟的坐标,射手对其进行射击,要求射击的鸟的坐标越来越大,即对于第i和第i+1只鸟,要求满足:xi<=xi+1 && yi <= yi+1。求最多能射击多少只鸟。

思路:将所有点按照x坐标排序,x坐标相同则按照y坐标排序。则x方向上可以满足限制,对y方向上求最长不下降子序列即可。由于数据量较大,需要采取nlogn的优化算法。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 100000;
 7 int s[N];
 8 int top;
 9 
10 struct Node 
11 {
12     int x, y;
13 } node[N];
14 
15 bool cmp( Node a, Node b )
16 {
17     if ( a.x != b.x ) return a.x < b.x;
18     return a.y < b.y;
19 }
20 
21 int main ()
22 {
23     int t;
24     scanf("%d", &t);
25     while ( t-- )
26     {
27         int n;
28         scanf("%d", &n);
29         for ( int i = 0; i < n; i++ )
30         {
31             scanf("%d%d", &node[i].x, &node[i].y);
32         }
33         sort( node, node + n, cmp );
34         top = 0;
35         s[top++] = node[0].y;
36         for ( int i = 1; i < n; i++ )
37         {
38             if ( node[i].y >= s[top - 1] )
39             {
40                 s[top++] = node[i].y;
41             }
42             else
43             {
44                 int tmp = upper_bound( s, s + top, node[i].y ) - s;
45                 s[tmp] = node[i].y;                
46             }
47         }
48         printf("%d
", top);        
49     }
50     return 0;
51 }

 

原文地址:https://www.cnblogs.com/huoxiayu/p/4401727.html