Submission #710980

#TimeUsernameProblemLanguageResultExecution timeMemory
710980pavementRainy Markets (CCO22_day1problem2)C++17
25 / 25
675 ms141516 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define int long long #define mp make_pair #define mt make_tuple #define pb push_back #define ppb pop_back #define eb emplace_back #define g0(a) get<0>(a) #define g1(a) get<1>(a) #define g2(a) get<2>(a) #define g3(a) get<3>(a) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using db = double; using ll = long long; using ld = long double; using ii = pair<int, int>; using iii = tuple<int, int, int>; using iiii = tuple<int, int, int, int>; template<class key, class value = null_type, class cmp = less<key> > using ordered_set = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>; int N, ans, srb, diff[1000005], B[1000005], P[1000005], U[1000005], V[1000005], ml[1000005], mr[1000005], OP[1000005]; vector<iii> rb; int fill(int &a, int &b) { int c = min(a, b); a -= c; b -= c; return c; } main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 1; i <= N; i++) { cin >> B[i]; } for (int i = 1; i < N; i++) { cin >> P[i]; OP[i] = P[i]; } for (int i = 1; i < N; i++) { cin >> U[i]; int tmp = P[i]; P[i] = max(0ll, P[i] - U[i]); V[i] = tmp - P[i]; assert(P[i] + V[i] == OP[i]); } for (int i = 1; i < N; i++) { ml[i] += fill(B[i], P[i]); mr[i] += fill(B[i + 1], P[i]); if (P[i]) { if (srb < P[i]) return cout << "NO\n", 0; int cnt = 0; while (cnt < P[i]) { assert(!rb.empty()); auto [v, idx, dir] = rb.back(); //~ cout << "RB " << v << ' ' << idx << ' ' << dir << '\n'; if (cnt + v > P[i]) { if (dir) mr[idx] -= P[i] - cnt; else ml[idx] -= P[i] - cnt; V[idx] += P[i] - cnt; B[i] += P[i] - cnt; g0(rb.back()) -= P[i] - cnt; srb -= P[i] - cnt; diff[idx + dir] += P[i] - cnt; diff[i] -= P[i] - cnt; cnt = P[i]; } else { if (dir) mr[idx] -= v; else ml[idx] -= v; V[idx] += v; B[i] += v; cnt += v; srb -= v; diff[idx + dir] += v; diff[i] -= v; rb.ppb(); } } //~ cout << "NOW " << B[i] << ' ' << B[i + 1] << ' ' << P[i] << '\n'; ml[i] += fill(B[i], P[i]); mr[i] += fill(B[i + 1], P[i]); //~ cout << "RES " << P[i] << '\n'; } //~ cout << "HERE " << i << ' ' << B[i] << ' ' << B[i + 1] << ' ' << V[i] << '\n'; int tmp1 = fill(B[i], V[i]); int tmp2 = fill(B[i + 1], V[i]); ml[i] += tmp1; mr[i] += tmp2; srb += tmp1 + tmp2; //~ cout << "T12 " << tmp1 << ' ' << tmp2 << '\n'; rb.eb(tmp1, i, 0); rb.eb(tmp2, i, 1); while (srb > mr[i]) { if (g0(rb.back()) <= srb - mr[i]) { srb -= g0(rb.back()); rb.ppb(); } else { g0(rb.back()) -= (srb - mr[i]); srb = mr[i]; } } //~ cout << "! " << i << ' ' << ml[i] << ' ' << mr[i] << '\n'; } for (int i = 1; i < N; i++) { ans += V[i]; } cout << "YES\n" << ans << '\n'; for (int i = 1; i < N; i++) { diff[i] += diff[i - 1]; assert(ml[i] + V[i] + mr[i] == OP[i]); cout << ml[i] + diff[i] << ' ' << V[i] << ' ' << mr[i] - diff[i] << '\n'; assert(ml[i] + diff[i] >= 0 && V[i] >= 0 && mr[i] - diff[i] >= 0); } }

Compilation message (stderr)

Main.cpp:36:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   36 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...