Submission #230459

#TimeUsernameProblemLanguageResultExecution timeMemory
230459VEGAnnNLO (COCI18_nlo)C++14
110 / 110
944 ms62332 KiB
#include <bits/stdc++.h> #define sz(x) ((int)x.size()) #define pii pair<int,int> #define pis pair<int,short> #define ft first #define sd second #define MP make_pair #define PB push_back #define all(x) x.begin(),x.end() using namespace std; typedef long long ll; const int oo = 2e9; const int N = 100100; vector<int> events[N]; set<int> st; int n, m, k; ll ans = 0; ll sqr(ll x) { return (x * x); } ll dist(int &x1, int &x2, int &y1, int y2){ return sqr(x1 - x2) + sqr(y1 - y2); } int make(int fi, int se){ int res = fi; res <<= 7; res += abs(se); res <<= 1; if (se < 0) res += 1; return res; } pis get(int vl){ int fi = 0, se = 0; bool ot = bool(vl & 1); vl >>= 1; se = vl % (1 << 7); fi = (vl >> 7); if (ot) se = -se; return MP(fi, se); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef _LOCAL freopen("in.txt","r",stdin); #endif // _LOCAL cin >> n >> m >> k; for (int i = 0; i < k; i++){ int x, y, r; cin >> x >> y >> r; int ro = max(1, x - r), lf = y, rt = y; ll rr = sqr(r); while (ro <= x){ while (lf > 1 && dist(x, ro, y, lf - 1) <= rr) lf--; while (rt < m && dist(x, ro, y, rt + 1) <= rr) rt++; events[ro].PB(make(lf, i + 1)); events[ro].PB(make(rt + 1, -(i + 1))); ro++; } ro = min(n, x + r), lf = y, rt = y; while (ro > x){ while (lf > 1 && dist(x, ro, y, lf - 1) <= rr) lf--; while (rt < m && dist(x, ro, y, rt + 1) <= rr) rt++; events[ro].PB(make(lf, i + 1)); events[ro].PB(make(rt + 1, -(i + 1))); ro--; } } for (int i = 1; i <= n; i++){ int lst = 0; if (!sz(events[i])){ ans += ll(k) * ll(m); continue; } sort(all(events[i])); st.clear(); st.insert(0); for (int it = 0; it < sz(events[i]); ){ int j = it; pis cur = get(events[i][j]); ans += (ll(cur.ft) - ll(lst) - 1) * (ll(k) - ll(*(--st.end()))); lst = cur.ft - 1; while (j < sz(events[i]) && lst + 1 == cur.ft){ if (cur.sd < 0) st.erase(-cur.sd); else st.insert(cur.sd); j++; if (j < sz(events[i])) cur = get(events[i][j]); } it = j; } if (lst < m) ans += (ll(m) - ll(lst)) * ll(k); } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...