Submission #1152019

#TimeUsernameProblemLanguageResultExecution timeMemory
1152019trufanov.pLottery (CEOI18_lot)C++20
100 / 100
537 ms12468 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <string>
#include <queue>
#include <unordered_set>
#include <deque>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, l;
    cin >> n >> l;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    vector<pair<int, int>> qr;
    int q;
    cin >> q;
    for (int i = 0; i < q; ++i) {
        int k;
        cin >> k;
        qr.push_back({ k, i });
    }
    sort(qr.begin(), qr.end());
    vector<vector<int>> add(n, vector<int>(q));
    vector<int> suff(l + 1);
    int itd = 0, its = 0;
    while (itd <= l || its < q) {
        if (itd == l + 1) {
            break;
        }
        if (its == q) {
            suff[itd] = q;
            itd++;
            continue;
        }
        if (itd > qr[its].first) {
            its++;
        } else {
            suff[itd] = its;
            itd++;
        }
    }
    for (int shift = 1; shift + l <= n; ++shift) {
        int curdiff = 0;
        for (int i = 0; i < l; ++i) {
            if (a[i] != a[i + shift]) {
                curdiff++;
            }
        }
        if (suff[curdiff] < q) {
            add[0][suff[curdiff]]++;
            add[shift][suff[curdiff]]++;
        }
        for (int i = 1; i + shift + l <= n; ++i) {
            if (a[i - 1] != a[i + shift - 1]) {
                curdiff--;
            }
            if (a[i + l - 1] != a[i + shift + l - 1]) {
                curdiff++;
            }
            if (suff[curdiff] < q) {
                add[i][suff[curdiff]]++;
                add[i + shift][suff[curdiff]]++;
            }
        }
    }
    vector<vector<int>> ans(q, vector<int>(n));
    for (int i = 0; i + l <= n; ++i) {
        int curs = 0;
        for (int j = 0; j < q; ++j) {
            curs += add[i][j];
            ans[qr[j].second][i] = curs;
        }
    }
    for (int i = 0; i < q; ++i) {
        for (int j = 0; j + l <= n; ++j) {
            cout << ans[i][j] << ' ';
        }
        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...