活动执行问题:优先队列模型
Processor
https://ac.nowcoder.com/acm/problem/115275
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #include <sstream> #include <iomanip> #include <cmath> #include <bitset> #include <assert.h> using namespace std; typedef long long ll; typedef set<int>::iterator ssii; #define Cmp(a, b) memcmp(a, b, sizeof(b)) #define Cpy(a, b) memcpy(a, b, sizeof(b)) #define Set(a, v) memset(a, v, sizeof(a)) #define debug(x) cout << #x << ": " << x << endl #define _forS(i, l, r) for(set<int>::iterator i = (l); i != (r); i++) #define _rep(i, l, r) for(int i = (l); i <= (r); i++) #define _for(i, l, r) for(int i = (l); i < (r); i++) #define _forDown(i, l, r) for(int i = (l); i >= r; i--) #define debug_(ch, i) printf(#ch"[%d]: %d\n", i, ch[i]) #define debug_m(mp, p) printf(#mp"[%d]: %d\n", p->first, p->second) #define debugS(str) cout << "dbg: " << str << endl; #define debugArr(arr, x, y) _for(i, 0, x) { _for(j, 0, y) printf("%c", arr[i][j]); printf("\n"); } #define _forPlus(i, l, d, r) for(int i = (l); i + d < (r); i++) #define lowbit(i) (i & (-i)) #define MPR(a, b) make_pair(a, b) pair<int, int> crack(int n) { int st = sqrt(n); int fac = n / st; while (n % st) { st += 1; fac = n / st; } return make_pair(st, fac); } inline ll qpow(ll a, int n) { ll ans = 1; for(; n; n >>= 1) { if(n & 1) ans *= 1ll * a; a *= a; } return ans; } template <class T> inline bool chmax(T& a, T b) { if(a < b) { a = b; return true; } return false; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll ksc(ll a, ll b, ll mod) { ll ans = 0; for(; b; b >>= 1) { if (b & 1) ans = (ans + a) % mod; a = (a * 2) % mod; } return ans; } ll ksm(ll a, ll b, ll mod) { ll ans = 1 % mod; a %= mod; for(; b; b >>= 1) { if (b & 1) ans = ksc(ans, a, mod); a = ksc(a, a, mod); } return ans; } template <class T> inline bool chmin(T& a, T b) { if(a > b) { a = b; return true; } return false; } bool _check(int x) { // return true; } int bsearch1(int l, int r) { while (l < r) { int mid = (l + r) >> 1; if(_check(mid)) r = mid; else l = mid + 1; } return l; } int bsearch2(int l, int r) { while (l < r) { int mid = (l + r + 1) >> 1; if(_check(mid)) l = mid; else r = mid - 1; } return l; } template<class T> bool lexSmaller(vector<T> a, vector<T> b) { int n = a.size(), m = b.size(); int i; for(i = 0; i < n && i < m; i++) { if (a[i] < b[i]) return true; else if (b[i] < a[i]) return false; } return (i == n && i < m); } // ============================================================== // const int Max = 10000000; const int maxn = 20000; int n; class A { public: int l, r, w; A() = default; A(int l, int r, int w) : l(l), r(r), w(w) {} bool operator< (const A &rhs) const { return r > rhs.r; } } a[maxn]; inline bool cmp(const A &a, const A &b) { return a.l < b.l; } bool check(int speed) { priority_queue<A> que; int i = 1; _rep(p, 1, maxn) { while (i <= n && a[i].l == p) que.push(a[i++]); if (que.empty()) { if (i > n) break; else continue; } int tot = speed; while (que.size() && tot > 0) { A t = que.top(); que.pop(); if (t.r <= p && t.w > 0) return false; if (tot >= t.w) { tot -= t.w; t.w = 0; } else { t.w -= tot; tot = 0; que.push(t); } } } return que.empty(); } void solve() { sort(a+1, a+1+n, cmp); int L = 0, R = Max; while (L < R) { int mid = (L + R) >> 1; if (check(mid)) R = mid; else L = mid + 1; } printf("%d\n", L); } void init() { // } int main() { //freopen("input.txt", "r", stdin); int kase; cin >> kase; while (kase--) { init(); scanf("%d", &n); _rep(i, 1, n) scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].w); // solve solve(); } }