Submission #1279191

#TimeUsernameProblemLanguageResultExecution timeMemory
1279191MisterReaperRope (JOI17_rope)C++20
55 / 100
2595 ms8280 KiB
// File rope.cpp created on 14.10.2025 at 17:22:16
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, M;
    std::cin >> N >> M;

    std::vector<int> A(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> A[i];
        --A[i];
    }

    std::vector<int> overall(N);
    for (int i = 0; i < N; ++i) {
        overall[A[i]] += 1;
    }

    for (int c = 0; c < M; ++c) {
        int ans = N - overall[c];
        { // Case 1: First single
            std::vector<int> cnt(M);
            int now = 0;
            if (A[0] == c) {
                // ok
            } else {
                cnt[A[0]] += 1;
            }
            for (int i = 1; i < N; i += 2) {
                if (i + 1 == N) {
                    if (A[N - 1] == c) {
                        // ok
                    } else {
                        cnt[A[N - 1]] += 1;
                    }
                } else {
                    int x = (A[i] == c) + (A[i + 1] == c);
                    if (x == 2) {
                        // ok
                    } else if (x == 1) {
                        now += 1;
                    } else {
                        cnt[A[i]] += 1;
                        cnt[A[i + 1]] += 1;
                    }
                }
            }
            int mx = *std::max_element(cnt.begin(), cnt.end());
            int sum = std::accumulate(cnt.begin(), cnt.end(), 0);
            debug(now, cnt);
            now += sum - mx;
            ans = std::min(ans, now);
        }
        { // Case 2: First both
            std::vector<int> cnt(M);
            int now = 0;
            for (int i = 0; i < N; i += 2) {
                if (i + 1 == N) {
                    if (A[N - 1] == c) {
                        // ok
                    } else {
                        cnt[A[N - 1]] += 1;
                    }
                } else {
                    int x = (A[i] == c) + (A[i + 1] == c);
                    if (x == 2) {
                        // ok
                    } else if (x == 1) {
                        now += 1;
                    } else {
                        cnt[A[i]] += 1;
                        cnt[A[i + 1]] += 1;
                    }
                }
            }
            int mx = *std::max_element(cnt.begin(), cnt.end());
            int sum = std::accumulate(cnt.begin(), cnt.end(), 0);
            debug(now, cnt);
            now += sum - mx;
            ans = std::min(ans, now);
        }
        std::cout << ans << '\n';
    }

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