111

------监狱栅栏------  •  11小时前


#include <iostream> 
#include<algorithm>
using namespace std;
struct eq {
	int left;
	int right;
}info[100001];
bool oo(eq e1, eq e2) {
	if (e1.right == e2.right) {
		return e1.left < e2.left;
	}
	return e1.right < e2.right;
}
int dp[100001];
int main() {
	int n, a, b, cnt;
	cin >> n;
	cnt = n;
	for (int i = 1; i <= cnt; i++) {
		cin >> a >> b;
		info[i].left = a + 1;
		info[i].right = n - b;
		if (info[i].left > info[i].right) {
			cnt--;
			i--;
		}
	}
	sort(info + 1, info + cnt + 1, oo);
	for (int i = 2, last = 1; i <= cnt; i++) {
		if (info[i].left != info[i - 1].left || info[i].right != info[i - 1].right) {
			dp[info[i - 1].right] = max(dp[info[i - 1].right], dp[info[i-1].left - 1] + i - last);
			last = i;
		}
		if (info[i].right == info[i].right) {
			for (int j = info[i-1].right + 1; j <= info[i].right; j++)dp[j] = dp[j - 1];
		}
		if (i == cnt) {
			dp[info[i].right] = max(dp[info[i].right], dp[info[i].left - 1] + i - last + 1);
			for (int j = info[i].right + 1; j <= n; j++)dp[j] = dp[j - 1];
		}
	}
	if (cnt <= 1) cout << cnt;
	else cout << n - dp[n];
	return 0;
}

评论:

请先登录,才能进行评论