Submission #230432

#TimeUsernameProblemLanguageResultExecution timeMemory
230432VEGAnnNLO (COCI18_nlo)C++14
0 / 110
414 ms65540 KiB
#include <bits/stdc++.h> #define sz(x) ((int)x.size()) #define pii pair<int,int> #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<pii> events[N]; set<int> st; int n, m, k; ll ans = 0; ll sqr(ll x) { return (x * x); } ll dist(ll x1, ll x2, ll y1, ll y2){ return sqr(x1 - x2) + sqr(y1 - y2); } 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(MP(lf, i + 1)); events[ro].PB(MP(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(MP(lf, i + 1)); events[ro].PB(MP(rt + 1, -(i + 1))); ro--; } } for (int i = 1; i <= n; i++){ int lst = 0; sort(all(events[i])); st.clear(); st.insert(0); for (int it = 0; it < sz(events[i]); ){ int j = it; ans += (ll(events[i][j].ft) - ll(lst) - 1) * (ll(k) - ll(*(--st.end()))); lst = events[i][j].ft - 1; while (j < sz(events[i]) && events[i][j].ft == events[i][it].ft){ if (events[i][j].sd < 0) st.erase(-events[i][j].sd); else st.insert(events[i][j].sd); j++; } it = j; } if (lst < m) ans += (ll(m) - ll(lst)) * ll(k); } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...