This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define IO_OP std::ios::sync_with_stdio(0); std::cin.tie(0);
#define F first
#define S second
#define V vector
#define PB push_back
#define MP make_pair
#define EB emplace_back
#define ALL(v) (v).begin(), (v).end()
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef V<int> vi;
string _reset = "\u001b[0m", _yellow = "\u001b[33m", _bold = "\u001b[1m";
void DBG() { cerr << "]" << _reset << endl; }
template<class H, class...T> void DBG(H h, T ...t) {
cerr << to_string(h);
if(sizeof ...(t)) cerr << ", ";
DBG(t...);
}
#ifdef CHEISSMART
#define debug(...) cerr << _yellow << _bold << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
#else
#define debug(...)
#endif
const int INF = 1e9 + 7, N = 1e6 + 7;
int p[N], q[N];
ll a[N], b[N], s[N], t[N];
V<pi> G[N];
signed main()
{
IO_OP;
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> a[i] >> s[i] >> p[i];
a[i] += a[i - 1];
}
for(int i = 1; i <= m; i++) {
cin >> b[i] >> t[i] >> q[i];
b[i] += b[i - 1];
}
ll ans = 0;
for(int i = 1; i <= n; i++) {
/*
a[i] + b[j] <= s[i]
b[j] <= s[i] - a[i]
*/
int j = int(upper_bound(b, b + m + 1, s[i] - a[i]) - b);
if(!j) continue;
// if(i-th a before j-th b) ans += p[i]
G[i].EB(j, p[i]);
}
for(int j = 1; j <= m; j++) {
/*
a[i] + b[j] <= t[j]
a[i] <= t[j] - b[j]
*/
int i = int(upper_bound(a, a + n + 1, t[j] - b[j]) - a);
if(!i) continue;
// original: if(j-th b before i-th a) ans += q[j]
ans += q[j];
// now: if(i-th a before j-th b) ans += -q[j]
G[i].EB(j, -q[j]);
}
// map<int, ll> mp;
V<ll> mp(m + 1);
for(int i = 1; i <= n; i++) {
sort(ALL(G[i]), [&](pi x, pi y) {
return x.S < y.S;
});
for(auto [j, v] : G[i]) {
// 0 ~ j - 1 add v
for(int k = 0; k < j; k++)
mp[k] += v;
for(int k = 1; k <= m; k++)
mp[k] = max(mp[k], mp[k - 1]);
// ans += v;
// mp[j] -= v;
// if(mp[j] < 0) {
// auto it = mp.find(j);
// assert(it -> S < 0);
// while(it -> S < 0) {
// it++;
// if(it != mp.end()) {
// mp[it -> F] += mp[prev(it) -> F];
// mp.erase(prev(it));
// } else {
// mp.erase(prev(it));
// break;
// }
// }
// }
}
}
ans += mp[m];
// for(auto [x, y]:mp) {
// ans += y;
// assert(y >= 0);
// }
cout << ans << '\n';
}
Compilation message (stderr)
dishes.cpp: In function 'int main()':
dishes.cpp:79:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
79 | for(auto [j, v] : G[i]) {
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |