Submission #778372

# Submission time Handle Problem Language Result Execution time Memory
778372 2023-07-10T08:57:29 Z fve5 Pairs (IOI07_pairs) C++17
100 / 100
151 ms 10536 KB
#include <bits/stdc++.h>
using namespace std;

struct Fenwick {
  vector<int> arr;

  void add(int x, int d) {
    for (; x < arr.size(); x += x & -x)
      arr[x] += d;
  }

  int query(int x) {
    int ans = 0;
    for (; x; x -= x & -x)
      ans += arr[x];
    return ans;
  }

  Fenwick(int size) : arr(size) { }  
};

void _1D(int N, int D, int M) {
  vector<int> animals(N);
  for (auto &x: animals) cin >> x;
  sort(animals.begin(), animals.end());

  long long ans = 0;
  queue<int> in_range;
  for (auto x: animals) {
    while (!in_range.empty() && x - in_range.front() > D) {
      in_range.pop();
    }
    ans += in_range.size();
    in_range.push(x);
  }
  cout << ans << '\n';
}

void _2D(int N, int D, int M) {
  vector<pair<int, int>> animals(N);
  for (auto &[x, y]: animals) {
    int i, j; cin >> i >> j;
    x = i + j - 1;
    y = j - i + M;
  }

  sort(animals.begin(), animals.end());
  Fenwick fenwick(2 * M);

  long long ans = 0;
  queue<pair<int, int>> in_range;
  for (auto [x, y]: animals) {
    while (!in_range.empty() && x - in_range.front().first > D) {
      fenwick.add(in_range.front().second, -1);
      in_range.pop();
    }
    ans += fenwick.query(min(2 * M - 1, y + D)) - fenwick.query(max(0, y - D - 1));
    in_range.push({x, y});
    fenwick.add(y, 1);
  }
  cout << ans << '\n';
}

int prefix_sums[76][200][200];

void _3D(int N, int D, int M) {
  vector<tuple<int, int, int>> animals(N);
  for (auto &[x, y, z]: animals) {
    int i, j, k; cin >> i >> j >> k;
    x = i + j - 1;
    y = j - i + M;
    z = k;

    prefix_sums[z][x][y]++;
  }

  for (int k = 1; k <= M; k++) {
    for (int i = 1; i < 2 * M; i++) {
      for (int j = 1; j < 2 * M; j++) {
        prefix_sums[k][i][j] += prefix_sums[k][i - 1][j] + prefix_sums[k][i][j - 1] - prefix_sums[k][i - 1][j - 1];
      }
    }
  }

  long long ans = 0;
  for (auto [x, y, z]: animals) {
    for (int curr_z = max(1, z - D); curr_z <= min(M, z + D); curr_z++) {
      int off = abs(z - curr_z);
      ans += prefix_sums[curr_z][min(2 * M - 1, x + D - off)][min(2 * M - 1, y + D - off)]
        - prefix_sums[curr_z][min(2 * M - 1, x + D - off)][max(0, y - D + off - 1)]
        - prefix_sums[curr_z][max(0, x - D + off - 1)][min(2 * M - 1, y + D - off)]
        + prefix_sums[curr_z][max(0, x - D + off - 1)][max(0, y - D + off - 1)];
    } 
  }
  cout << (ans - N) / 2 << endl;
}

int main() {
  ios::sync_with_stdio(false); cin.tie(NULL);
  int B, N, D, M; cin >> B >> N >> D >> M;

  if (B == 1) _1D(N, min(D, B * M), M);
  if (B == 2) _2D(N, min(D, B * M), M);
  if (B == 3) _3D(N, min(D, B * M), M);
}

Compilation message

pairs.cpp: In member function 'void Fenwick::add(int, int)':
pairs.cpp:8:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 |     for (; x < arr.size(); x += x & -x)
      |            ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 732 KB Output is correct
2 Correct 10 ms 988 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 724 KB Output is correct
2 Correct 14 ms 1108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 724 KB Output is correct
2 Correct 22 ms 728 KB Output is correct
3 Correct 14 ms 728 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 852 KB Output is correct
2 Correct 1 ms 852 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 1160 KB Output is correct
2 Correct 19 ms 1896 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 1120 KB Output is correct
2 Correct 23 ms 1492 KB Output is correct
3 Correct 23 ms 1536 KB Output is correct
4 Correct 22 ms 1380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 28 ms 1636 KB Output is correct
2 Correct 26 ms 2132 KB Output is correct
3 Correct 27 ms 2256 KB Output is correct
4 Correct 26 ms 2024 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 9300 KB Output is correct
2 Correct 9 ms 9300 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 1748 KB Output is correct
2 Correct 19 ms 1708 KB Output is correct
3 Correct 17 ms 1620 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 34 ms 7344 KB Output is correct
2 Correct 64 ms 7332 KB Output is correct
3 Correct 47 ms 7320 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 101 ms 10532 KB Output is correct
2 Correct 151 ms 10536 KB Output is correct
3 Correct 69 ms 10536 KB Output is correct