Submission #702793

#TimeUsernameProblemLanguageResultExecution timeMemory
702793veehzStrange Device (APIO19_strange_device)C++17
20 / 100
1757 ms524288 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef __int128_t i128; /* Lazy Sparse Segment Tree (Unsure of correctness) */ template <class S, S (*op)(S, S, long long), S (*e)()> struct lazysparseSegtree { /* S op(S a, S b, long long len) {} -> Combine values, op(a,b,len) = * op(op(a,b,len-1),b,1) */ /* S e() {} -> Initial value (0) */ typedef long long ll; ll l, r; S val; bool marked; S flag; lazysparseSegtree<S, op, e>*left, *right; lazysparseSegtree(ll _l, ll _r) : lazysparseSegtree(_l, _r, e()) {} lazysparseSegtree(ll _l, ll _r, S _val) : lazysparseSegtree(_l, _r, _val, false, e()) {} lazysparseSegtree(ll _l, ll _r, S _val, bool _marked, S _flag) : l(_l), r(_r), val(_val), marked(_marked), flag(_flag), left(nullptr), right(nullptr) {} void push() { if (marked) { if (left == nullptr) left = new lazysparseSegtree<S, op, e>(l, (l + r) / 2, e()); if (right == nullptr) right = new lazysparseSegtree<S, op, e>((l + r) / 2 + 1, r, e()); left->set(flag); right->set(flag); marked = false; } } void set(ll L, ll R, S x) { if (R < l || r < L) return; if (L <= l && r <= R) { set(x); return; } push(); if (left == nullptr) left = new lazysparseSegtree<S, op, e>(l, (l + r) / 2, e()); if (right == nullptr) right = new lazysparseSegtree<S, op, e>((l + r) / 2 + 1, r, e()); left->set(L, R, x); right->set(L, R, x); val = op(left->val, right->val, 1); } void set(S x) { if (marked) { flag = x; val = x * (r-l+1); } else { marked = true; flag = x; val = x * (r-l+1); } } S prod(ll ql, ll qr) { if (qr < l || r < ql) return e(); if (ql <= l && r <= qr) return val; push(); S sml = e(), smr = e(); if (left != nullptr) sml = left->prod(ql, qr); if (right != nullptr) smr = right->prod(ql, qr); return op(sml, smr, 1); } S prod(ll q) { return prod(q, q); } }; /* End: Lazy Sparse Segment Tree */ ll op(ll a, ll b, ll len) { return a + b * len; } ll e() { return 0; } const int NINF = -1e9; int main() { ll n, a, b; cin >> n >> a >> b; vector<pair<ll, ll>> v(n); for (int i = 0; i < n; i++) cin >> v[i].first >> v[i].second; lazysparseSegtree<ll, op, e> root(0, 1e18 + 1); ll gc = __gcd(a, b + 1); bool smallEnough = (i128(a) / gc * i128(b) <= LONG_LONG_MAX); ll cy = smallEnough ? a / gc * b : NINF; for (int i = 0; i < n; i++) { auto& p = v[i]; ll l = p.first, r = p.second; if (smallEnough && r - l + 1 >= cy) { cerr << "FULL" << endl; cout << cy << endl; return 0; } if (smallEnough) { l %= cy; r %= cy; if (l > r) { root.set(l, cy - 1, 1); root.set(0, r, 1); } else { root.set(l, r, 1); } } else { root.set(l, r, 1); } } cout << root.prod(0, 1e18 + 1) << endl; }
#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...