Submission #1203846

#TimeUsernameProblemLanguageResultExecution timeMemory
1203846badge881Distributing Candies (IOI21_candies)C++20
Compilation error
0 ms0 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; const int MxN = 2e5 + 5; int n, q; long long lz[MxN * 4]; const long long Inf = 1e18; // every segmentis [a;b] struct node { long long val; pair<long long, long long> mx, mn; node() : val(0), mx({0, -1}), mn({0, -1}) {} node(long long val, long long idx) : val(val), mx({val, idx}), mn({val, idx}) {} node(long long mx, long long mn, long long idx) : val(0), mx({mx, idx}), mn({mn, idx}) {} friend node operator+(const node &l, const node &r) { node res = node(); res.val = l.val + r.val; res.mx = max(l.mx, r.mx); res.mn = min(l.mn, r.mn); return res; } } segm[MxN * 4]; pair<node, long long> operator+(pair<node, long long> c, node o) { c.first = c.first + o; return c; } void push(long long l, long long r, long long idx) { segm[idx].val += lz[idx]; segm[idx].mx.first += lz[idx]; segm[idx].mn.first += lz[idx]; if (l < r) { lz[idx * 2 + 1] += lz[idx]; lz[idx * 2 + 2] += lz[idx]; } lz[idx] = 0; } void build(long long l, long long r, long long idx) { if (l == r) return void(segm[idx] = node(0, l)); long long mid = (l + r) >> 1long long; build(l, mid, idx * 2 + 1); build(mid + 1, r, idx * 2 + 2); segm[idx] = segm[idx * 2 + 1] + segm[idx * 2 + 2]; } void update(long long l, long long r, long long idx, long long tl, long long tr, long long val) { push(l, r, idx); if (l > tr || r < tl) return; if (l >= tl && r <= tr) { lz[idx] += val; push(l, r, idx); return; } long long mid = (l + r) >> 1long long; push(l, mid, idx * 2 + 1); push(mid + 1, r, idx * 2 + 2); update(l, mid, idx * 2 + 1, tl, tr, val); update(mid + 1, r, idx * 2 + 2, tl, tr, val); segm[idx] = segm[idx * 2 + 1] + segm[idx * 2 + 2]; } pair<node, long long> query(long long l, long long r, long long idx, long long k, node cur) { push(l, r, idx); if (l == r) return {segm[idx] + cur, l}; long long mid = (l + r) >> 1long long; push(l, mid, idx * 2 + 1); push(mid + 1, r, idx * 2 + 2); node qrr = segm[idx * 2 + 2] + cur; if (qrr.mx.first - qrr.mn.first > k) return query(mid + 1, r, idx * 2 + 2, k, cur); else return query(l, mid, idx * 2 + 1, k, qrr); } node oo(long long l, long long r, long long idx, long long pos) { push(l, r, idx); if (l == r) return segm[idx]; long long mid = (l + r) >> 1LL; push(l, mid, idx * 2 + 1); push(mid + 1, r, idx * 2 + 2); if (pos <= mid) return oo(l, mid, idx * 2 + 1, pos); else return oo(mid + 1, r, idx * 2 + 2, pos); } vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { n = c.size(); q = l.size(); vector<int> s(n); vector<vector<pair<long long, long long>>> cq(n, vector<pair<long long, long long>>()); for (int i = 0; i < q; i++) { cq[l[i]].emplace_back(v[i], i); if (r[i] + 1 < n) cq[r[i] + 1].emplace_back(-v[i], i); } build(0, q - 1 + 2, 0); long long cur = 0; update(0, q - 1 + 2, 0, 0, q - 1 + 2, Inf); update(0, q - 1 + 2, 0, 1, q - 1 + 2, -Inf); for (int i = 0; i < n; i++) { for (auto &[x, y] : cq[i]) update(0, q - 1 + 2, 0, y + 2, q - 1 + 2, x), cur += x; auto cqr = query(0, q - 1 + 2, 0, c[i], node(-Inf, Inf, 0)); auto z = cqr.first; if (z.mx.second < z.mn.second) s[i] = cur - z.mn.first; else s[i] = cur - (z.mx.first - c[i]); } return s; }

Compilation message (stderr)

candies.cpp: In function 'void build(long long int, long long int, long long int)':
candies.cpp:53:32: error: unable to find numeric literal operator 'operator""long'
   53 |     long long mid = (l + r) >> 1long long;
      |                                ^~~~~
candies.cpp: In function 'void update(long long int, long long int, long long int, long long int, long long int, long long int)':
candies.cpp:70:32: error: unable to find numeric literal operator 'operator""long'
   70 |     long long mid = (l + r) >> 1long long;
      |                                ^~~~~
candies.cpp: In function 'std::pair<node, long long int> query(long long int, long long int, long long int, long long int, node)':
candies.cpp:83:32: error: unable to find numeric literal operator 'operator""long'
   83 |     long long mid = (l + r) >> 1long long;
      |                                ^~~~~