题目大意:将小的布娃娃套进大的布娃娃总共需要多少个布娃娃。
思路:按宽度作为第一关键字升序排列,高度作为第二关键字降序排列,则高度的LIS就是所求的解。因为宽度是高到低,所以前面的必定能被LIS序列里面的某个数套进去,还有因为20 10不能套进20 10.所以在求LIS是不能用lower_bound(),因为lower_bound()求得是他所处位置但是在等于他本身那个数字的前面。所以要用upper_bound(),就可以了。。
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iostream>
#include <iomanip>
using namespace std;
#define maxn 20055
#define MOD 1000000007
#define mem(a) memset(a , 0 , sizeof(a))
#define memx(a) memset(a , 0x7f , sizeof(a))
#define LL __int64
#define INF 999999999
struct node
{
int w , h;
}arr[maxn];
int g[maxn];
bool cmp(node n1 , node n2)
{
if(n1.w == n2.w) return n1.h < n2.h;
else return n1.w > n2.w;
}
int main()
{
int t;
scanf("%d" , &t);
while(t--)
{
int n ;
scanf("%d" , &n);
for(int i = 0 ; i < n ; i ++) scanf("%d %d" , &arr[i].w , &arr[i].h);
sort(arr , arr + n , cmp);
memx(g);
int ans = 0;
for(int i = 0 ; i < n ; i ++)
{
int k = upper_bound(g , g + n , arr[i].h) - g;
g[k] = arr[i].h;
ans = max(ans , k+1);
}
printf("%d\n" , ans);
}
return 0;
}
/*
10
4
30 10 20 13 20 14 20 15
4
10 10 20 10 20 10 30 25
4
10 15 20 10 20 30 30 25
3
20 30 40 50 30 40
4
20 30 10 10 30 20 40 50
3
10 30 20 20 30 10
4
10 10 20 30 40 50 39 51
*/