답안 #570290

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
570290 2022-05-29T07:14:30 Z 600Mihnea Nuclearia (CEOI15_nuclearia) C++17
55 / 100
1000 ms 257116 KB
#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>> deri(n + 2, vector<ll> (m + 2, 0)),
                     jmen(n + 2, vector<ll> (m + 2, 0)),
                     difs(n + 2, vector<ll> (m + 2, 0)),
                        v(n + 2, vector<ll> (m + 2, 0));

  function<void(int, int, int, int, int, int)> proc = [&] (int dist, int r, int c, int a, int b, int rect_dim) {
    int L = max(1, c - dist), R = min(m, c + dist);
    assert(dist + 1 <= rect_dim);
    if (dist + 1 <= min(rect_dim, m - c)) {
      L = c + dist + 1;
      R = min(c + rect_dim, m);
      assert(L <= R);
      jmen[r][L] += (a + 1LL * b * c);
      jmen[r][R + 1] -= (a + 1LL * b * c);
      difs[r][L] -= 1LL * b * L;
      deri[r][L + 1] -= b;
      deri[r][R + 1] += b;
      difs[r][R + 1] += 1LL * b * R;
    }
    if (dist + 1 <= min(rect_dim, c - 1)) {
      L = max(c - rect_dim, 1);
      R = c - dist - 1;
      assert(L <= R);
      jmen[r][L] += (a - 1LL * b * c);
      jmen[r][R + 1] -= (a - 1LL * b * c);
      difs[r][L] += 1LL * b * L;
      deri[r][L + 1] += b;
      deri[r][R + 1] -= b;
      difs[r][R + 1] -= 1LL * b * R;
    }
  };

  int ops;
  cin >> ops;
  for (int i = 1; i <= ops; i++) {
    int r1, c, a, b, rect_dim;
    cin >> r1 >> c >> a >> b;
    if (Inverse) {
      swap(r1, c);
    }
    rect_dim = a / b;
    for (int dist = 0; (r1 + dist <= n || r1 - dist >= 1) && dist <= rect_dim - 1; dist++) {
      if (r1 + dist <= n) {
        int L = max(1, c - dist), R = min(m, c + dist);
        proc(dist, r1 + dist, c, a, b, rect_dim);
      }
      if (r1 - dist >= 1 && dist >= 1) {
        int L = max(1, c - dist), R = min(m, c + dist);
        proc(dist, r1 - dist, c, a, b, rect_dim);
      }
    }
    for (int dist = 0; (r1 + dist <= n || r1 - dist >= 1) && dist <= rect_dim; dist++) {
      if (r1 + dist <= n) {
        int L = max(1, c - dist), R = min(m, c + dist);
        jmen[r1 + dist][L] += (a - dist * b);
        jmen[r1 + dist][R + 1] -= (a - dist * b);
      }
      if (r1 - dist >= 1 && dist >= 1) {
        int L = max(1, c - dist), R = min(m, c + dist);
        jmen[r1 - dist][L] += (a - dist * b);
        jmen[r1 - dist][R + 1] -= (a - dist * b);
      }
    }
  }
  for (int r = 1; r <= n; r++) {
    for (int c = 1; c <= m; c++) {
      deri[r][c] += deri[r][c - 1];
      difs[r][c] += deri[r][c];
      difs[r][c] += difs[r][c - 1];
      jmen[r][c] += jmen[r][c - 1];
      v[r][c] += jmen[r][c];
      v[r][c] += difs[r][c];
    }
  }
  {

    for (int i = 1; i <= n; i++) {
      ll cur = 0;
      for (int j = 1; j <= m; j++) {
        cur += v[i][j];
        v[i][j] = v[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 = v[r2][c2] - v[r1 - 1][c2] - v[r2][c1 - 1] + v[r1 - 1][c1 - 1];
    ll area = (r2 - r1 + 1) * (c2 - c1 + 1);

    cout << total / area + (total % area >= area - total % area) << "\n";
  }
}

Compilation message

nuclearia.cpp: In function 'int main()':
nuclearia.cpp:64:13: warning: unused variable 'L' [-Wunused-variable]
   64 |         int L = max(1, c - dist), R = min(m, c + dist);
      |             ^
nuclearia.cpp:64:35: warning: unused variable 'R' [-Wunused-variable]
   64 |         int L = max(1, c - dist), R = min(m, c + dist);
      |                                   ^
nuclearia.cpp:68:13: warning: unused variable 'L' [-Wunused-variable]
   68 |         int L = max(1, c - dist), R = min(m, c + dist);
      |             ^
nuclearia.cpp:68:35: warning: unused variable 'R' [-Wunused-variable]
   68 |         int L = max(1, c - dist), R = min(m, c + dist);
      |                                   ^
# 결과 실행 시간 메모리 Grader output
1 Correct 154 ms 254664 KB Output is correct
2 Correct 58 ms 2708 KB Output is correct
3 Correct 55 ms 2272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 143 ms 254660 KB Output is correct
2 Correct 61 ms 2696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 50 ms 78924 KB Output is correct
2 Correct 70 ms 2764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 87464 KB Output is correct
2 Correct 56 ms 2704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 239 ms 256948 KB Output is correct
2 Correct 88 ms 2908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 151 ms 104468 KB Output is correct
2 Correct 73 ms 2644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 160 ms 81416 KB Output is correct
2 Correct 59 ms 2896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 140 ms 69244 KB Output is correct
2 Correct 59 ms 2636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 358 ms 257024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 325 ms 257116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1097 ms 78924 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1093 ms 78904 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1098 ms 80752 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1081 ms 79000 KB Time limit exceeded
2 Halted 0 ms 0 KB -