제출 #1305486

#제출 시각아이디문제언어결과실행 시간메모리
1305486kawhiet모자이크 (IOI24_mosaic)C++20
48 / 100
173 ms37940 KiB
#include <bits/stdc++.h>
#include "mosaic.h"
using namespace std;

vector<long long> mosaic(vector<int> x, vector<int> y, vector<int> T, vector<int> B, vector<int> L, vector<int> R) {
  int n = x.size(), q = T.size();
  set<int> s;
  vector<vector<int>> row(3, vector<int>(n));
  row[0] = x;
  row[1][0] = y[1];
  row[2][0] = y[2];
  for (int i = 1; i < 3; i++) {
    for (int j = 1; j < n; j++) {
      row[i][j] = !(row[i - 1][j] | row[i][j - 1]);
      if (row[i][j]) {
        s.insert(i - j);
      }
    }
  }
  vector<vector<int>> col(n, vector<int>(3));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 3; j++) {
      if (j == 0) {
        col[i][j] = y[i];
        continue;
      }
      if (i == 0) {
        col[i][j] = x[j];
        continue;
      }
      col[i][j] = !(col[i - 1][j] | col[i][j - 1]);
      if (col[i][j]) {
        s.insert(i - j);
      }
    }
  }
  vector<int> v;
  for (auto x : s) {
    v.push_back(x);
  }
  auto get = [&](int l, int r) {
    if (l > r) swap(l, r);
    auto it = ranges::upper_bound(v, r);
    auto ti = ranges::lower_bound(v, l);
    return it - ti;
  };
  vector<vector<int>> p(3, vector<int>(n + 1));
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < n; j++) {
      p[i][j + 1] = p[i][j] + row[i][j];
    }
  }
  vector<long long> ret;
  for (int i = 0; i < q; i++) {
    int t = T[i], b = B[i], l = L[i], r = R[i];
    if (t <= 2) {
      ret.push_back(p[t][r + 1] - p[t][l]);
    } else {
      int cur = 0;
      while (l <= 2 && l <= r) {
        cur += col[t][l++];
      }
      if (l <= r) {
        int tl = t - l, tr = t - r;
        cur += get(tl, tr);
      }
      ret.push_back(cur);
    }
  }
  return ret;
}
#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...