Submission #1213927

#TimeUsernameProblemLanguageResultExecution timeMemory
1213927adaawfMosaic (IOI24_mosaic)C++20
100 / 100
104 ms27676 KiB
#include <bits/stdc++.h>
using namespace std;
long long int a[5][200005], b[200005][5], c[200005], d[200005], z;
long long int trya(int x, int y) {
    if (x < 3) return a[x][y];
    if (y < 3) return b[x][y];
    long long int h = a[2][y] + b[x][2] - a[2][2];
    if (x < y) {
        h += d[x];
        h += c[y] - c[y - (x - 3) - 1];
    }
    else {
        h += c[y];
        h += d[x] - d[x - (y - 3) - 1];
    }
    h -= z * (min(x, y) - 2);
    return h;
}
vector<long long int> mosaic(vector<int> x, vector<int> y, vector<int> t, vector<int> B, vector<int> l, vector<int> r) {
    for (int i = 0; i < x.size(); i++) {
        a[1][i + 1] = x[i];
        if (i < 3) a[i + 1][1] = y[i];
    }
    for (int i = 0; i < y.size(); i++) {
        b[i + 1][1] = y[i];
        if (i < 3) b[1][i + 1] = x[i];
    }
    int n = x.size();
    for (int j = 2; j <= 3; j++) {
        for (int k = 2; k <= n; k++) {
            if (a[j - 1][k] == 0 && a[j][k - 1] == 0) a[j][k] = 1;
            else a[j][k] = 0;
        }
    }
    for (int k = 2; k <= 3; k++) {
        for (int j = 2; j <= n; j++) {
            if (b[j - 1][k] == 0 && b[j][k - 1] == 0) b[j][k] = 1;
            else b[j][k] = 0;
        }
    }
    int h = 0;
    for (int i = 3; i <= n; i++) {
        h += a[3][i];
        c[i] = c[i - 1] + h;
    }
    h = 0;
    for (int i = 3; i <= n; i++) {
        h += b[i][3];
        d[i] = d[i - 1] + h;
    }
    z = a[3][3];
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= n; j++) {
            a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + a[i][j];
        }
    }
    for (int j = 1; j <= 3; j++) {
        for (int i = 1; i <= n; i++) {
            b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1] + b[i][j];
        }
    }
    vector<long long int> res;
    for (int i = 0; i < t.size(); i++) {
        t[i]++; B[i]++; l[i]++; r[i]++;
        res.push_back(trya(B[i], r[i]) - trya(B[i], l[i] - 1) - trya(t[i] - 1, r[i]) + trya(t[i] - 1, l[i] - 1));
    }
    return res;
}
#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...