SSL P1336 膜拜神牛___动态规划

题目大意:

在这里插入图片描述
n ≤ 1 0 5 n≤10^5 n105

分析:

满足不被互膜时, a i > = a j , b i > b j ai>=aj,bi>bj ai>=aj,bi>bj
注意 a i = a j ai=aj ai=aj时,不管 b i , b j bi,bj bi,bj,他们必互膜
然后就是a排序,b做lis

代码:

#include 
#include 
#include 
#include 
#include 
#include 

#define rep(i, st, ed) for (int i = st; i <= ed; i++) 
#define rwp(i, ed, st) for (int i = ed; i >= st; i--)

#define N 100005

using namespace std;

struct Node { 
    int a, b;
}C[N];
int dp[N], n, cnt, top, ans;

int Get_lis() {
	top = 0; 
	for (int i = 1; i <= cnt; i++)
		if (!top || C[i].b < dp[top]) dp[++top] = C[i].b;
		else {
			int L = 1, R = top, op = 0;
			while (L <= R) {
				int mid = (L + R) >> 1;
				if (C[i].b > dp[mid]) op = mid, R = mid - 1; 
				                 else L = mid + 1;
			}
			if (dp[op - 1] != C[i].b) dp[op] = C[i].b;
		}
	return top;
}


bool cmp(Node aa, Node bb) {
	if (aa.a == bb.a) return aa.b < bb.b;
	return aa.a > bb.a;
}

int main() {
	scanf("%d", &n);
	rep(i, 1, n) scanf("%d %d", &C[i].a, &C[i].b);
	sort(C + 1, C + n + 1, cmp); 
	rep(i, 1, n) 
	    if (C[i].a != C[i - 1].a || C[i].b != C[i - 1].b) C[++cnt].a = C[i].a, C[cnt].b = C[i].b;
	ans = Get_lis();
    printf("%d\n", ans);  
	return 0;	
}

你可能感兴趣的:(C++,动态规划)