【思路要点】
- 考虑 rrr 互不相同的情况。
- rrr 互不相同意味着如果按照天数顺序处理,只要不拖过右端点,我们就始终能够完成订单。
- 那么可以考虑拖得尽可能久,这样就有机会一次性处理更多的订单。
- 处理订单时优先处理右端点靠左的订单即可,需要用堆维护订单集合,并用 setsetset 维护器材集合。
- 对于 rrr 可能相同的情况,可以将 rrr 相同的区间保留最短者,其余区间的 rrr 均减去 111 ,则得到的问题与原问题等价。以下代码采用了另外一种考虑方式,用线段树维护了能够拖到的时间,而没有作上述转化。
- 时间复杂度 O(NLogN)O(NLogN)O(NLogN) 。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 5; const int INF = 1e9 + 7; typedef long long ll; typedef long double ld; typedef unsigned long long ull; template <typename T> void chkmax(T &x, T y) { x = max(x, y); } template <typename T> void chkmin(T &x, T y) { x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); } template <typename T> void writeln(T x) { write(x); puts(""); } int n, m; set <int> st; map <int, int> mp; struct info { int l, r, c; } a[MAXN]; struct SegmentTree