Submission #1242925

#TimeUsernameProblemLanguageResultExecution timeMemory
1242925ericl23302Mosaic (IOI24_mosaic)C++20
48 / 100
120 ms28440 KiB
#include "mosaic.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

vector<ll> fenwick(5e5, 0);

void add(int n, int pos) {
    while (pos <= n) {
        ++fenwick[pos];
        pos += (pos)&(-pos);
    }
}

ll get(int n, int pos) {
    ll res = 0;
    while (pos >= 1) {
        res += fenwick[pos];
        pos -= (pos)&(-pos);
    }
    return res;
}

ll sum(int n, int left, int right) {
    return get(n, right) - (left > 1 ? get(n, left - 1) : 0);
}

std::vector<long long> mosaic(std::vector<int> X, std::vector<int> Y, std::vector<int> T, std::vector<int> B, std::vector<int> L, std::vector<int> R) {
    int Q = (int)T.size();
    std::vector<long long> C(Q, 0);
    
    int n = X.size();
    if (n == 1) return vector<ll>(Q, X[0]);

    vector<vector<pair<int, pair<int, int>>>> queries(n);
    for (int i = 0; i < Q; ++i) queries[T[i]].push_back({i, {L[i], R[i]}});

    vector<ll> preSum0(n, X[0]);
    for (int i = 1; i < n; ++i) preSum0[i] = preSum0[i - 1] + X[i];
    for (auto &[idx, lAndr] : queries[0]) C[idx] = preSum0[lAndr.second] - (lAndr.first ? preSum0[lAndr.first - 1] : 0);

    vector<int> row1(n), col1(n), col2(n);
    row1[0] = Y[1]; col1[0] = X[1];
    for (int i = 1; i < n; ++i) row1[i] = ((row1[i - 1] + X[i] == 0) ? 1 : 0), col1[i] = ((col1[i - 1] + Y[i] == 0) ? 1 : 0);
    if (n > 2) {
        col2[0] = X[2];
        for (int i = 1; i < n; ++i) col2[i] = ((col2[i - 1] + col1[i] == 0) ? 1 : 0);
    }

    int curShift = n + 5, fenwickN = curShift * 2;
    for (int i = 1; i < n; ++i) {
        if (row1[i]) add(fenwickN, curShift + i);
    }

    for (int i = 1; i < n; ++i) {
        // cout << "I: " << i << endl;
        // for (int j = 1; j <= fenwickN; ++j) cout << sum(fenwickN, j, j) << ' ';
        // cout << endl;
        for (auto &[idx, lAndr] : queries[i]) C[idx] = sum(fenwickN, lAndr.first + curShift, lAndr.second + curShift) + (lAndr.first == 0 ? Y[i] : 0);
        --curShift;
        if (i < n - 1 && col1[i + 1]) {
            add(fenwickN, curShift + 1);
        }
        if (i != 1 && i < n - 1 && col2[i + 1] && col1[i] == 0) add(fenwickN, curShift + 2);
        if (i == 1 && i < n - 1) {
            int prev = col1[i + 1];
            for (int j = 2; j < n; ++j) {
                if (row1[j - 1] + row1[j] + prev == 0) add(fenwickN, curShift + j);
                if (row1[j] + prev == 0) prev = 1;
                else prev = 0;
            }
        }
        // for (int j = 1; j <= fenwickN; ++j) cout << sum(fenwickN, j, j) << ' ';
        // cout << endl;
    }

    return C;
}
#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...