Submission #1171827

#TimeUsernameProblemLanguageResultExecution timeMemory
1171827LithaniumLottery (CEOI18_lot)C++20
100 / 100
2386 ms8920 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse4")

#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> diag;
int dt[10005];
int queries[105];
vector<int> comp;
vector<int> ans[10005];
int psum[10005];
int N, K;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> N >> K;
    for (int i = 1; i <= N; i ++) cin >> dt[i];
    int Q;
    cin >> Q;
    for (int i = 1; i <= Q; i ++) {
        cin >> queries[i];
        comp.push_back(queries[i]);
    }
    sort(comp.begin(), comp.end());
    comp.resize(unique(comp.begin(), comp.end()) - comp.begin());
    for (int i = 1; i <= N; i ++) ans[i].resize(comp.size()+1);
    // Make the diagonals
    for (int i = 2; i <= N; i ++) {
        diag.clear();
        int I = i, J = 1;
        while (max(I, J) <= N) {
            diag.push_back({I, J});
            I ++, J ++;
        }
        int n = diag.size();
        for (int i = 0; i <= n; i ++) psum[i] = 0;
        for (int i = 0; i < n; i ++) if (dt[diag[i].first] == dt[diag[i].second]) {
            // update the diagonal
            int p = max(0, i - K + 1);
            psum[p] ++, psum[i+1] --;
        }
        for (int i = 0; i < n; i ++) {
            if (i > 0) psum[i] += psum[i-1];
            auto [a, b] = diag[i];
            if (a + K - 1 > N or b + K - 1 > N) break;
            int ind = lower_bound(comp.begin(), comp.end(), K-psum[i]) - comp.begin();
            ans[a][ind] ++;
        }
    }
    for (int j = 2; j <= N; j ++) {
        diag.clear();
        int I = 1, J = j;
        for (int I = 1, J = j; I <= N and J <= N; I ++, J ++) {
            diag.push_back({I, J});
        }
        int n = diag.size();
        for (int i = 0; i <= n; i ++) psum[i] = 0;
        for (int i = 0; i < n; i ++) if (dt[diag[i].first] == dt[diag[i].second]) {
            // update the diagonal
            int p = max(0, i - K + 1);
            psum[p] ++, psum[i+1] --;
        }
        for (int i = 0; i < n; i ++) {
            if (i > 0) psum[i] += psum[i-1];
            auto [a, b] = diag[i];
            if (a + K - 1 > N or b + K - 1 > N) break;
            int ind = lower_bound(comp.begin(), comp.end(), K-psum[i]) - comp.begin();
            ans[a][ind] ++;
        }
    }
    for (int j = 1; j <= N; j ++) for (int i = 1; i < ans[j].size(); i ++) ans[j][i] += ans[j][i-1];
    for (int i = 1; i <= Q; i ++) {
        int ind = lower_bound(comp.begin(), comp.end(), queries[i]) - comp.begin();
        for (int j = 1; j <= N-K+1; j ++) {
            cout << ans[j][ind] << " ";
        }
        cout << "\n";
    }
}
#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...