Submission #1252995

#TimeUsernameProblemLanguageResultExecution timeMemory
1252995Semen07Rope (JOI17_rope)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>

int main() {
    // freopen("main.in", "r", stdin);
    // freopen("main.out", "w", stdout);
    int n;
    size_t m;
    std::cin >> n >> m;
    std::vector<size_t> a(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> a[i];
        --a[i];
    }
    std::vector<int> all_ans(m);
    std::map<std::pair<size_t, size_t>, int> cnt2;
    std::vector<int> cnt(m, 0);
    for (int i = 0; i < n; i += 2) {
        if (i + 1 < n) {
            cnt2[{a[i], a[i + 1]}]++, cnt[a[i]]++;
            if (a[i] != a[i + 1]) cnt2[{a[i + 1], a[i]}]++, cnt[a[i + 1]]++;
        } else {
            cnt[a[i]]++;
        }
    }
    std::vector<std::set<std::pair<int, size_t>>> d2(m);
    std::set<std::pair<int, size_t>> d;
    for (size_t i = 0; i < m; ++i) {
        d.emplace(cnt[i], i);
    }
    for (int i = 0; i + 1 < n; i += 2) {
        if (a[i] != a[i + 1]) {
            d2[a[i]].emplace(cnt[a[i + 1]] - 2 * cnt2[{a[i], a[i + 1]}], a[i + 1]);
            d2[a[i + 1]].emplace(cnt[a[i]] - 2 * cnt2[{a[i], a[i + 1]}], a[i]);
        }
    }
    for (size_t f = 0; f < m; ++f) {
        int ans = n - cnt2[{f, f}] - cnt[f];
        if (!d2[f].empty()) ans = std::min(ans, n - cnt[f] - (--d2[f].end())->first);
        for (auto [x, y]: d2[f]) {
            d.erase({cnt[y], y});
        }
        if (!d.empty()) ans = std::min(ans, n - cnt[f] - (--d.end())->first);
        for (auto [x, y]: d2[f]) {
            d.insert({cnt[y], y});
        }
        all_ans[f] = ans;
    }
    cnt2.clear();
    cnt.assign(m, 0);
    for (int i = -1; i < n; i += 2) {
        if (i + 1 < n && i > 0) {
            cnt2[{a[i], a[i + 1]}]++, cnt[a[i]]++;
            if (a[i] != a[i + 1]) cnt2[{a[i + 1], a[i]}]++, cnt[a[i + 1]]++;
        } else {
            if (i + 1 == n) cnt[a[i]]++;
            else cnt[a[i + 1]]++;
        }
    }
    d2.assign(m, {});
    d.clear();
    for (size_t i = 0; i < m; ++i) {
        d.emplace(cnt[i], i);
    }
    for (int i = 1; i + 1 < n; i += 2) {
        if (a[i] != a[i + 1]) {
            d2[a[i]].emplace(cnt[a[i + 1]] - 2 * cnt2[{a[i], a[i + 1]}], a[i + 1]);
            d2[a[i + 1]].emplace(cnt[a[i]] - 2 * cnt2[{a[i], a[i + 1]}], a[i]);
        }
    }
    for (size_t f = 0; f < m; ++f) {
        int ans = n - cnt2[{f, f}] - cnt[f];
        if (!d2[f].empty()) ans = std::min(ans, n - cnt[f] - (--d2[f].end())->first);
        for (auto [x, y]: d2[f]) {
            d.erase({cnt[y], y});
        }
        if (!d.empty()) ans = std::min(ans, n - cnt[f] - (--d.end())->first);
        for (auto [x, y]: d2[f]) {
            d.insert({cnt[y], y});
        }
        all_ans[f] = std::min(all_ans[f], ans);
        std::cout << all_ans[f] << '\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...