Submission #938652

#TimeUsernameProblemLanguageResultExecution timeMemory
938652danikoynovTwo Dishes (JOI19_dishes)C++14
10 / 100
10064 ms27744 KiB
#include <bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const int maxn = 2e5 + 10; int n, m; ll a[maxn], s[maxn], p[maxn]; ll b[maxn], t[maxn], q[maxn]; ll pref[2][maxn]; void input() { cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i] >> s[i] >> p[i]; for (int i = 1; i <= m; i ++) cin >> b[i] >> t[i] >> q[i]; } void prefix_sums() { for (int i = 1; i <= n; i ++) { pref[0][i] = pref[0][i - 1] + a[i]; } for (int i = 1; i <= m; i ++) { pref[1][i] = pref[1][i - 1] + b[i]; } } ll dp[maxn], temp[maxn]; vector < pair < int, ll > > upd[maxn]; int X[maxn], Y[maxn]; const ll inf = 1e18; void dynamic() { for (int i = 1; i <= n; i ++) { ll free_time = s[i] - pref[0][i]; while(X[i] <= m && pref[1][X[i]] <= free_time) X[i] ++; X[i] --; upd[i - 1].push_back({X[i] + 1, - p[i]}); ///cout << "point " << i - 1 << " " << X[i] + 1 << " " << -p[i] << endl; } for (int i = 1; i <= m; i ++) { ll free_time = t[i] - pref[1][i]; while(Y[i] <= n && pref[0][Y[i]] <= free_time) Y[i] ++; Y[i] --; if (Y[i] >= 0) { upd[Y[i]].push_back({i, q[i]}); //cout << "point " << Y[i] << " " << i << " " << q[i] << endl; } } for (int j = 0; j <= m; j ++) dp[j] = 0; for (pair < int, ll > cur : upd[0]) for (int d = cur.first; d <= m; d ++) dp[d] += cur.second; for (int i = 1; i <= m; i ++) dp[i] = max(dp[i], dp[i - 1]); for (int i = 1; i <= n; i ++) { sort(upd[i].begin(), upd[i].end()); for (int j = 0; j <= m; j ++) temp[j] = 0; ll sum = 0; for (int j = 0; j < upd[i].size(); j ++) { int cur = upd[i][j].first; int nxt = m + 1; if (j + 1 < upd[i].size()) nxt = upd[i][j + 1].first; sum += upd[i][j].second; if (upd[i][j].first == 0 || i == n) { for (int d = cur; d < nxt; d ++) dp[d] += sum; } else { ll bef = dp[upd[i][j].first - 1]; int last = cur - 1; for (int d = cur; d < nxt; d ++) { if (dp[d] + sum < bef) last = d; } for (int d = cur; d <= last; d ++) dp[d] = bef; for (int d = last + 1; d < nxt; d ++) dp[d] += sum; } } /*for (pair < int, ll > cur : upd[i]) { sum += cur.second; ll var = dp[cur.first] + sum; //cout << "update point " << cur.first << " " << cur.second << endl; for (int d = cur.first; d <= m; d ++) { temp[d] += cur.second; } } for (int j = 0; j <= m; j ++) { ///best = max(best, dp[j]); dp[j] += temp[j]; } if (i != n) { for (int j = 1; j <= m; j ++) dp[j] = max(dp[j - 1], dp[j]); }*/ /**cout << "state " << i << endl; for (int j = 0; j <= m; j ++) cout << dp[j] << " "; cout << endl;*/ } ll res = 0; for (int i = 1; i <= n; i ++) res += p[i]; res = res + dp[m]; cout << res << endl; /**for (int i = 0; i <= n; i ++) { for (int j = 0; j <= m; j ++) { if (i > 0) { dp[i][j] = max(dp[i][j], dp[i - 1][j] + (pref[0][i] + pref[1][j] <= s[i])); } if (j > 0) { dp[i][j] = max(dp[i][j], dp[i][j - 1] + (pref[0][i] + pref[1][j] <= t[j])); } ///cout << "state " << i << " " << j << " " << dp[i][j] << endl; } } cout << dp[n][m] << endl;*/ } void solve() { input(); prefix_sums(); dynamic(); } int main() { speed(); solve(); return 0; } /** 9 12 414814218 278771326 1 142790158 568604393 1 155567225 14012701 1 627555390 1224920860 1 677068511 5243031298 1 580933994 8598159379 1 819258172 1432469030 1 340548310 999347990 1 432162069 4373255579 1 99824657 11080715 1 756309567 9502204999 1 929699364 2343419815 1 376204577 6097684636 1 399553538 2306014840 1 824786328 4994974413 1 536419761 3247725215 1 953903194 10674273733 1 787043482 3936134684 1 105275489 567691865 1 861537554 117255456 1 434345770 2420939138 1 */

Compilation message (stderr)

dishes.cpp: In function 'void dynamic()':
dishes.cpp:93:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |         for (int j = 0; j < upd[i].size(); j ++)
      |                         ~~^~~~~~~~~~~~~~~
dishes.cpp:97:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |             if (j + 1 < upd[i].size())
      |                 ~~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...