Submission #570068

#TimeUsernameProblemLanguageResultExecution timeMemory
570068600MihneaNuclearia (CEOI15_nuclearia)C++17
17 / 100
1095 ms100328 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; signed main() { ios::sync_with_stdio(0); cin.tie(0); /// freopen ("input.txt", "r", stdin); bool Inverse = 0; int n, m; cin >> n >> m; if (n > m) { Inverse = 1; swap(n, m); } assert(n <= m); vector<vector<ll>> radiation(n + 1, vector<ll> (m + 1, 0)), v(n + 1, vector<ll> (m + 1, 0)); function<void(int, int, int, int, int)> proc = [&] (int dist, int r, int c, int a, int b) { int stop = max(m - c, c - 1); assert(a - dist * b >= 1); int L = max(1, c - dist), R = min(m, c + dist); for (int j = L; j <= R; j++) { v[r][j] += a - dist * b; } if (dist + 1 <= stop) { for (int dist2 = dist + 1; dist2 <= stop; dist2++) { assert(c + dist2 <= m || c - dist2 >= 1); if (c + dist2 <= m) { int c2 = c + dist2; int dist_max = max(dist, dist2); v[r][c2] += max(0LL, a - 1LL * b * dist_max); } if (c - dist2 >= 1 && dist2 >= 1) { int c2 = c - dist2; int dist_max = max(dist, dist2); v[r][c2] += max(0LL, a - 1LL * b * dist_max); } } } }; int ops; cin >> ops; for (int i = 1; i <= ops; i++) { int r, c, a, b; cin >> r >> c >> a >> b; if (Inverse) { swap(r, c); } for (int r2 = 1; r2 <= n; r2++) { for (int c2 = 1; c2 <= m; c2++) { int dist = max(abs(r - r2), abs(c - c2)); radiation[r2][c2] += max(0LL, a - 1LL * b * dist); } } for (int dist = 0; r + dist <= n || r - dist >= 1 && a - dist * b >= 1; dist++) { if (r + dist <= n) { proc(dist, r + dist, c, a, b); } if (r - dist >= 1 && dist >= 1) { proc(dist, r - dist, c, a, b); } } } assert(v == radiation); { /// transform the radiation in the form of prefix rectangle sum for (int i = 1; i <= n; i++) { ll cur = 0; for (int j = 1; j <= m; j++) { cur += radiation[i][j]; radiation[i][j] = radiation[i - 1][j] + cur; } } } int q; cin >> q; while (q--) { int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2; if (Inverse) { swap(r1, c1); swap(r2, c2); } ll total = radiation[r2][c2] - radiation[r1 - 1][c2] - radiation[r2][c1 - 1] + radiation[r1 - 1][c1 - 1]; ll area = (r2 - r1 + 1) * (c2 - c1 + 1); cout << total / area + (total % area >= area - total % area) << "\n"; } }

Compilation message (stderr)

nuclearia.cpp: In function 'int main()':
nuclearia.cpp:62:55: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   62 |     for (int dist = 0; r + dist <= n || r - dist >= 1 && a - dist * b >= 1; dist++) {
      |                                         ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
#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...
#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...