Submission #1106532

#TimeUsernameProblemLanguageResultExecution timeMemory
1106532OctagonsMosaic (IOI24_mosaic)C++17
100 / 100
333 ms26188 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+2, lim = 3; int n, q, a[lim][N], b[N][lim]; vector<int> v, v2; ll pref[N], pref2[N]; ll geta(int rw, int l, int r) { return a[rw][r] - (l ? a[rw][l-1] : 0); } ll getb(int col, int l, int r) { l = max(l, lim-1); if (l > r)return 0; return b[r][col] - b[l-1][col]; } ll getp(int l, int r) { return pref[r] - (l ? pref[l-1] : 0ll); } ll getp2(int l, int r) { return pref2[r] - (l ? pref2[l-1] : 0ll); } ll get(int x, int y) { if (x < 0 || y < 0)return 0; ll ret = 0; for (int i = 0; i+1 < lim && i <= x; i++) { ret += geta(i, 0, y); } for (int i = 0; i+1 < lim && i <= y; i++) { ret += getb(i, 0, x); } if (x+1 < lim || y+1 < lim)return ret; x -= (lim - 1), y -= (lim - 1); int id = upper_bound(v.begin(), v.end(), y+1) - v.begin(); if (id) { --id; int id2 = upper_bound(v.begin(), v.end(), y-x) - v.begin(); --id2; id2 = min(id2, id); if (id2 == -1) { ret += ll(id+1) * ll(y+1) - getp(0, id); } else { ret += ll(id2+1) * ll(x+1); if (id2 != id)ret += ll(id-id2) * ll(y+1) - getp(id2+1, id); } } swap(x, y); id = upper_bound(v2.begin(), v2.end(), y+1) - v2.begin(); if (id) { --id; int id2 = upper_bound(v2.begin(), v2.end(), y-x) - v2.begin(); --id2; id2 = min(id2, id); if (id2 == -1) { ret += ll(id+1) * ll(y+1) - getp2(0, id); } else { ret += ll(id2+1) * ll(x+1); if (id2 != id)ret += ll(id-id2) * ll(y+1) - getp2(id2+1, id); } } return ret; } vector<long long> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R) { q = L.size(); n = X.size(); v.clear(); v2.clear(); vector<long long> ret(q); for (int i = 0; i < n; i++) { a[0][i] = X[i]; b[i][0] = Y[i]; if (i < lim) { b[0][i] = X[i]; a[i][0] = Y[i]; } } for (int i = 1; i < lim; i++) { for (int j = 1; j < n; j++) { a[i][j] = (a[i-1][j] || a[i][j-1] ? 0 : 1); } } for (int i = 0; i < lim; i++) { for (int j = 1; j < n; j++) { if (i == lim-1) { continue; } a[i][j] += a[i][j-1]; } } for (int i = 1; i < n; i++) { for (int j = 1; j < lim; j++) { b[i][j] = (b[i-1][j] || b[i][j-1] ? 0 : 1); } } for (int i = 1; i < n; i++) { for (int j = 0; j < lim; j++) { if (j == lim-1) { continue; } b[i][j] += b[i-1][j]; } } for (int i = lim-1; i < n; i++) { if (a[lim-1][i]) { v.push_back(i - (lim - 1)); } } for (int j = lim; j < n; j++) { if (b[j][lim-1]) { v2.push_back(j - (lim - 1)); } } ll sm = 0; for (int i = 0; i < v.size(); i++) { sm += ll(v[i]); pref[i] = sm; } sm = 0; for (int i = 0; i < v2.size(); i++) { sm += ll(v2[i]); pref2[i] = sm; } for (int i = 0; i < q; i++) { int x = T[i], y = L[i]; int x2 = B[i], y2 = R[i]; ret[i] = get(x2, y2) - get(x-1, y2) - get(x2, y-1) + get(x-1, y-1); } return ret; }

Compilation message (stderr)

mosaic.cpp: In function 'std::vector<long long int> mosaic(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
mosaic.cpp:118:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |  for (int i = 0; i < v.size(); i++) {
      |                  ~~^~~~~~~~~~
mosaic.cpp:123:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |  for (int i = 0; i < v2.size(); i++) {
      |                  ~~^~~~~~~~~~~
#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...