[ABC325D] Printing Machine

这题主要是题面 不知道为什么会有两个版本。
// [x,y] 某种颜色编号i 只能放在一个区间内。。
// 且i之间不能冲突。。。
贴份代码 自己品。。这题大部分都写的很乱。。我看的题解。
逻辑就是 左端点放的下的情况下 右端点小的先处理


#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll __int128_t
#define ar array<int, 2>
#define arr array<int, 3>
int  n, m, k, inf = 1LL << 61, mod = 998244353;// 1e9+7;
const int N = 5e5 + 50;

void solve() {
	cin >> n;
	vector<ar>a(n);
	for (auto&[x, y] : a)
		cin >> x >> y, y += x + 1;
	a.push_back({inf, inf});
	sort(a.begin(), a.end());
	
	int t = 0, ans = 0;
	priority_queue<int, vector<int>, greater<int>>q;
	auto pop = [&]() {//这边封装一个清理无效区间的小函数 会让下面的主体逻辑更加清晰。
		while (q.size() && q.top() <= t)q.pop();
		// 就是y已经<=t了。。那么这个区间就已经放不了了。。。
		// 相当于是清理无效的区间。。
	};
	
	for (auto[x, y]  : a) {
		while (t < x && q.size() && q.top() > t) {
			q.pop(); t++, ans++;
			pop();//清理下。
		}
		t = max(t, x);
		q.push(y);
	}
	cout << ans;
};

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout << fixed << setprecision(15);
#ifdef DEBUG
	freopen("../1.in", "r", stdin);
#endif
	//init_f();
	//init();
	//expr();
	// int T; cin >> T; while(T--)
	solve();
	return 0;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值