Submission #1162313

#TimeUsernameProblemLanguageResultExecution timeMemory
1162313LithaniumLottery (CEOI18_lot)C++20
100 / 100
2417 ms8832 KiB
#pragma GCC optimize("O3")

#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;

void solve() {
    // Solve this diagonal
    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] ++;
    }
}

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 ++;
        }
        solve();
    }
    for (int j = 2; j <= N; j ++) {
        diag.clear();
        int I = 1, J = j;
        while (max(I, J) <= N) {
            diag.push_back({I, J});
            I ++, J ++;
        }
        solve();
    }
    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...