Submission #1105033

#TimeUsernameProblemLanguageResultExecution timeMemory
1105033flashmtMosaic (IOI24_mosaic)C++17
100 / 100
193 ms52668 KiB
#include "mosaic.h"
#include <bits/stdc++.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 = size(X);
  vector<vector<int>> a(n);
  a[0] = X;
  for (int i = 1; i < n; i++)
  {
    int len = i < 3 ? n : 3;
    a[i].resize(len);
    a[i][0] = Y[i];
    for (int j = 1; j < len; j++)
      a[i][j] = (a[i - 1][j] | a[i][j - 1]) ^ 1;
  }

  vector<vector<long long>> s(n);
  for (int i = 0; i < n; i++)
  {
    int len = i < 3 ? n : 3;
    s[i].resize(len);
    s[i][0] = a[i][0];
    if (i)
      s[i][0] += s[i - 1][0];
    for (int j = 1; j < len; j++)
    {
      s[i][j] = s[i][j - 1] + a[i][j];
      if (i)
        s[i][j] += s[i - 1][j] - s[i - 1][j - 1];
    }
  }

  vector<long long> sumRow(n), sumCol(n), cntRow(n), cntCol(n);
  for (int i = 2; i < n; i++)
  {
    sumRow[i] = sumRow[i - 1] + (a[2][i] ? i : 0);
    cntRow[i] = cntRow[i - 1] + a[2][i];
    sumCol[i] = sumCol[i - 1] + (a[i][2] ? i : 0);
    cntCol[i] = cntCol[i - 1] + a[i][2];
  }

  auto getColTriangle = [&](int x, int xx)
  {
    return 1LL * xx * (cntCol[xx - 1] - cntCol[x - 2]) - (sumCol[xx - 1] - sumCol[x - 2]);
  };

  auto getRowTriangle = [&](int y, int yy)
  {
    return 1LL * yy * (cntRow[yy - 1] - cntRow[y - 2]) - (sumRow[yy - 1] - sumRow[y - 2]);
  };

  auto get = [&](int x, int y)
  {
    if (x < 0 || y < 0)
      return 0LL;
    if (x < 3 || y < 3)
      return s[x][y];
    long long res = s[2][y] + s[x][2] - s[2][2];
    if (x <= y)
    {
      if (x >= 4)
        res += getColTriangle(4, x);
      res += getRowTriangle(y - (x - 3), y);
      res += (cntRow[y - (x - 1)] - cntRow[1]) * (x - 2);
    }
    else
    {
      if (y >= 4)
        res += getRowTriangle(4, y);
      res += getColTriangle(x - (y - 3), x);
      res += (cntCol[x - (y - 1)] - cntCol[1]) * (y - 2);
    }
    return res;
  };

  int q = size(T);
  vector<long long> ans(q);
  for (int i = 0; i < q; i++)
  {
    ans[i] = get(B[i], R[i]) + get(T[i] - 1, L[i] - 1);
    ans[i] -= get(B[i], L[i] - 1) + get(T[i] - 1, R[i]);
  }
  return ans;
}
#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...