toj 4071 最长不下降子序列nlogn解法

题目描述:给出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\n", top);        

49     }

50     return 0;

51 }

有关nlogn的LIS算法不太理解的可以参考我博客上另一篇文章。

 

你可能感兴趣的:(log)