Submission #814720

#TimeUsernameProblemLanguageResultExecution timeMemory
814720tranxuanbachCell Automaton (JOI23_cell)C++17
32 / 100
585 ms66996 KiB
#include <bits/stdc++.h> using namespace std; #define endl '\n' #define fi first #define se second #define For(i, l, r) for (auto i = (l); i < (r); i++) #define ForE(i, l, r) for (auto i = (l); i <= (r); i++) #define FordE(i, l, r) for (auto i = (l); i >= (r); i--) #define Fora(v, a) for (auto v: (a)) #define bend(a) (a).begin(), (a).end() #define isz(a) ((signed)(a).size()) using ll = long long; using ld = long double; using pii = pair <int, int>; using vi = vector <int>; using vpii = vector <pii>; using vvi = vector <vi>; const int N = 1e5 + 5, Q = 5e5 + 5; struct point{ int x, y; }; int n, q; point a[N]; int b[Q]; namespace subtask12{ bool check(){ ForE(i, 1, n){ if (not (abs(a[i].x) <= 1000 and abs(a[i].y) <= 1000)){ return false; } } ForE(i, 1, q){ if (not (b[i] <= 1000)){ return false; } } return true; } const int N = 4e3 + 5, offset = 2e3; int dist[N][N]; int ans[N]; vpii dir = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}}; void solve(){ For(x, 0, N){ For(y, 0, N){ dist[x][y] = -1; } } queue <pii> qu; ForE(i, 1, n){ a[i].x += offset; a[i].y += offset; dist[a[i].x][a[i].y] = 0; qu.emplace(a[i].x, a[i].y); } while (not qu.empty()){ auto [x, y] = qu.front(); qu.pop(); ans[dist[x][y]]++; if (dist[x][y] == N - 1){ break; } for (auto [dx, dy]: dir){ int tx = x + dx, ty = y + dy; if (0 <= tx and tx < N and 0 <= ty and ty < N and dist[tx][ty] == -1){ dist[tx][ty] = dist[x][y] + 1; qu.emplace(tx, ty); } } } ForE(i, 1, q){ cout << ans[b[i]] << "\n"; } } } namespace subtask34{ bool check(){ ForE(i, 1, n){ if (not (a[i].x == a[i].y)){ return false; } } return true; } vector <int> dif; vector <ll> suffdif; ll count_dist(int t){ if (t < 0){ return 0ll; } int idx = upper_bound(bend(dif), t) - dif.begin(); int cnt = isz(dif) - idx; ll area = (2ll * a[n].x + t) - (2ll * a[1].x - t) + 1; area -= (idx != isz(dif) ? suffdif[idx] : 0ll) * 2; area += (2 * t + 1) * cnt; area *= (2 * t + 1); return (area - (cnt + 1)) / 2 + (cnt + 1); } void solve(){ sort(a + 1, a + n + 1, [&](const point& p, const point& q){ return p.x < q.x; }); ForE(i, 2, n){ dif.emplace_back(a[i].x - a[i - 1].x); } sort(bend(dif)); suffdif = vector <ll>(bend(dif)); FordE(i, isz(suffdif) - 2, 0){ suffdif[i] += suffdif[i + 1]; } ForE(i, 1, q){ ll ans = count_dist(b[i]) - count_dist(b[i] - 1); cout << ans << "\n"; } } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("KEK.inp", "r", stdin); // freopen("KEK.out", "w", stdout); cin >> n >> q; ForE(i, 1, n){ cin >> a[i].x >> a[i].y; } ForE(i, 1, q){ cin >> b[i]; } if (subtask12::check()){ subtask12::solve(); return 0; } if (subtask34::check()){ subtask34::solve(); return 0; } } /* ==================================================+ INPUT | --------------------------------------------------| --------------------------------------------------| ==================================================+ OUTPUT | --------------------------------------------------| --------------------------------------------------| ==================================================+ */
#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...