Submission #1014710

#TimeUsernameProblemLanguageResultExecution timeMemory
1014710cadmiumskyDistributing Candies (IOI21_candies)C++17
100 / 100
1123 ms70352 KiB
#include "candies.h" #include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; #define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; template<typename T> struct AINT { vector<T> aint; int n; void init(int n_) { n = n_; aint.assign(n * 4 + 100, T()); } template<class CB> void walk(CB&& cb) { walk(cb, -2, n - 1); } template<class CB> void walk(CB&& cb, int l, int r) { walk(cb, l, r, 1, -2, n - 1); } template<class CB> void walk(CB&& cb, int l, int r, int node, int cl, int cr) { if(cr < l || r < cl) return; if(l <= cl && cr <= r && !cb(aint[node], cl, cr)) return; int mid = (cl + cr) >> 1, L = node + (cr - mid) * 2, R = node + 1; aint[node].push(aint[L], aint[R]); walk(cb, l, r, R, mid + 1, cr); walk(cb, l, r, L, cl, mid); aint[node].pull(aint[L], aint[R]); } }; const ll inf = 1e17 + 5; int get_mn(int a, int b) { return min(a, b); } struct FirstUnit { int mx, rightmn, rightP; int fullmn, fullP; int lazy; int sum; FirstUnit(int b = 0, int c = 0, int d = 0, int f = 0, int h = 0, int e = 0): mx(b), rightmn(c), rightP(d), fullmn(f), fullP(h), lazy(0), sum(e) {;} void pull(const FirstUnit& a, const FirstUnit& b) { *this = FirstUnit(max(a.mx, b.mx), -1, -1, min(a.fullmn, b.fullmn), -1, a.sum + b.sum); if(a.mx >= b.mx) { if(a.rightmn < b.fullmn) rightmn = a.rightmn, rightP = a.rightP; else rightmn = b.fullmn, rightP = b.fullP; } else rightmn = b.rightmn, rightP = b.rightP; fullP = a.fullP; if(fullmn == b.fullmn) fullP = b.fullP; return; } void apply(int a) { mx += a; rightmn += a; lazy += a; fullmn += a; } void push(FirstUnit& a, FirstUnit& b) { a.apply(lazy); b.apply(lazy); lazy = 0; } }; std::vector<signed> distribute_candies(std::vector<signed> c, std::vector<signed> l, std::vector<signed> r, std::vector<signed> v) { int n = sz(c), q = sz(l); vector<vector<pii>> opers(n + 1); for(int i = 0; i < q; i++) opers[l[i]].emplace_back(i, v[i]), opers[r[i] + 1].emplace_back(i, -v[i]); AINT<FirstUnit> operational; operational.init(q); operational.walk([&](auto& a, int cl, int cr) { if(cl != cr) return 1; a.rightP = a.fullP = cl; return 0; }); vector<signed> rez; operational.walk([&](FirstUnit& a, int cl, int cr) { a.apply(inf); return 0; }, -2, q - 1); operational.walk([&](FirstUnit& a, int cl, int cr) { a.sum += inf; return 0; }, -2, -2); operational.walk([&](FirstUnit& a, int cl, int cr) { a.apply(-inf); return 0; }, -1, q - 1); operational.walk([&](FirstUnit& a, int cl, int cr) { a.sum += -inf; return 0; }, -1, -1); for(int i = 0; i < n; i++) { for(auto [p, v] : opers[i]) { operational.walk([&](FirstUnit& a, int cl, int cr) { a.apply(v); return 0; }, p, q - 1); operational.walk([&](FirstUnit& a, int cl, int cr) { a.sum += v; return 0; }, p, p); //if(abs(p - 4107) <= 2) cerr << " + " << p << ' ' << v << '\n'; } //if(i < 16) continue; int target_bar = c[i]; int lastinterest = -1, lastmin = 0; operational.walk([&](FirstUnit& a, int cl, int cr) { if(cr <= lastinterest) return 0; int my_rightmn = a.rightmn, rP = a.rightP; operational.walk([&](FirstUnit& u, int tt, int tt2) { if(my_rightmn > u.fullmn) rP = u.fullP, my_rightmn = u.fullmn; return 0; }, cr + 1, q - 1); int R = a.mx - lastmin, L = a.mx - my_rightmn; if(L > target_bar || L > R) { lastinterest = rP; lastmin = my_rightmn; return 1; } else { return 0; } }); int sum = 0, mx = -inf; operational.walk([&](FirstUnit& a, int cl, int cr) { mx = max(mx, a.mx); sum += a.sum; return 0; }, lastinterest + 1, q - 1); rez.emplace_back(sum - max(0ll, mx - target_bar - lastmin)); } return rez; } #undef int

Compilation message (stderr)

candies.cpp: In lambda function:
candies.cpp:117:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  117 |             if(my_rightmn > u.fullmn) rP = u.fullP, my_rightmn = u.fullmn; return 0;
      |             ^~
candies.cpp:117:76: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  117 |             if(my_rightmn > u.fullmn) rP = u.fullP, my_rightmn = u.fullmn; return 0;
      |                                                                            ^~~~~~
#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...