Submission #521568

#TimeUsernameProblemLanguageResultExecution timeMemory
521568eecsDistributing Candies (IOI21_candies)C++17
100 / 100
379 ms38424 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 200010; int C; ll mn[maxn << 2], mx[maxn << 2], tag[maxn << 2]; vector<pair<int, int>> Q[maxn]; #define mid (l + r >> 1) #define ls (k << 1) #define rs (k << 1 | 1) void apply(int k, ll v) { mn[k] += v, mx[k] += v, tag[k] += v; } void pushdown(int k) { apply(ls, tag[k]), apply(rs, tag[k]), tag[k] = 0; } void add(int k, int l, int r, int ql, int qr, ll v) { if (l >= ql && r <= qr) { apply(k, v); return; } pushdown(k); if (mid >= ql) add(ls, l, mid, ql, qr, v); if (mid < qr) add(rs, mid + 1, r, ql, qr, v); mn[k] = min(mn[ls], mn[rs]), mx[k] = max(mx[ls], mx[rs]); } int find(int k, int l, int r, ll &cmn, ll &cmx) { if (l < r && max(cmx, mx[k]) - min(cmn, mn[k]) >= C) { pushdown(k); int t = find(rs, mid + 1, r, cmn, cmx); return ~t ? t : find(ls, l, mid, cmn, cmx); } else { cmn = min(cmn, mn[k]), cmx = max(cmx, mx[k]); } return cmx - cmn >= C ? l : -1; } ll query(int k, int l, int r, int p) { if (l == r) return mx[k]; pushdown(k); return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p); } vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { int n = c.size(), q = l.size(); for (int i = 0; i < q; i++) { Q[l[i]].emplace_back(i + 1, v[i]); Q[r[i] + 1].emplace_back(i + 1, -v[i]); } vector<int> ans; ll cur = 0; for (int i = 0; i < n; i++) { for (auto p : Q[i]) add(1, 0, q, p.first, q, p.second), cur += p.second; C = c[i]; if (mx[1] - mn[1] < C) { ans.push_back(cur - mn[1]); continue; } ll cmn = LLONG_MAX, cmx = LLONG_MIN; int pos = find(1, 0, q, cmn, cmx); ll v = query(1, 0, q, pos); if (v == cmn) ans.push_back(cur + C - cmx); else ans.push_back(cur - cmn); } return ans; }

Compilation message (stderr)

candies.cpp: In function 'void add(int, int, int, int, int, ll)':
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:20:6: note: in expansion of macro 'mid'
   20 |  if (mid >= ql) add(ls, l, mid, ql, qr, v);
      |      ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:20:28: note: in expansion of macro 'mid'
   20 |  if (mid >= ql) add(ls, l, mid, ql, qr, v);
      |                            ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:21:6: note: in expansion of macro 'mid'
   21 |  if (mid < qr) add(rs, mid + 1, r, ql, qr, v);
      |      ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:21:24: note: in expansion of macro 'mid'
   21 |  if (mid < qr) add(rs, mid + 1, r, ql, qr, v);
      |                        ^~~
candies.cpp: In function 'int find(int, int, int, ll&, ll&)':
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:28:20: note: in expansion of macro 'mid'
   28 |   int t = find(rs, mid + 1, r, cmn, cmx);
      |                    ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:29:31: note: in expansion of macro 'mid'
   29 |   return ~t ? t : find(ls, l, mid, cmn, cmx);
      |                               ^~~
candies.cpp: In function 'll query(int, int, int, int)':
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:39:9: note: in expansion of macro 'mid'
   39 |  return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
      |         ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:39:33: note: in expansion of macro 'mid'
   39 |  return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
      |                                 ^~~
candies.cpp:11:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   11 | #define mid (l + r >> 1)
      |              ~~^~~
candies.cpp:39:53: note: in expansion of macro 'mid'
   39 |  return mid >= p ? query(ls, l, mid, p) : query(rs, mid + 1, r, p);
      |                                                     ^~~
#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...