Submission #837481

#TimeUsernameProblemLanguageResultExecution timeMemory
837481_martynasRope (JOI17_rope)C++11
100 / 100
785 ms80596 KiB
#include <bits/stdc++.h>

using namespace std;

const int mxn = 1e6+5;

int n, m;
int a[mxn], ans[mxn];
int mxcnt = 0;
int cnt[mxn], revcnt[mxn];
vector<vector<int>> where;

void add(int x) {
    if(cnt[x] == mxcnt) mxcnt++;
    revcnt[cnt[x]]--;
    cnt[x]++;
    revcnt[cnt[x]]++;
}

void rem(int x) {
    if(cnt[x] == mxcnt && revcnt[cnt[x]] == 1) mxcnt--;
    revcnt[cnt[x]]--;
    cnt[x]--;
    revcnt[cnt[x]]++;
}

int main(int argc, char const *argv[]) {
    cin >> n >> m;
    where.resize(m+1);
    for(int i = 0; i < n; i++) cin >> a[i], where[a[i]].push_back(i);
    for(int i = 1; i <= m; i++) ans[i] = n;
    // skip first
    int curr = n;
    for(int i = 0; i < n; i++) add(a[i]);
    for(int i = 1; i <= m; i++) {
        for(int j : where[i]) {
            curr--; rem(a[j]);
            if(j % 2) {
                // from left
                if(j == n-1) continue; // not part of a pair
                if(a[j+1] != i) rem(a[j+1]);
            }
            else {
                // from right
                if(j == 0) continue; // not part of a pair
                if(a[j-1] != i) rem(a[j-1]);
            }
        }
        ans[i] = min(ans[i], curr-mxcnt);
        for(int j : where[i]) {
            curr++; add(a[j]);
            if(j % 2) {
                // from left
                if(j == n-1) continue; // not part of a pair
                if(a[j+1] != i) add(a[j+1]);
            }
            else {
                // from right
                if(j == 0) continue; // not part of a pair
                if(a[j-1] != i) add(a[j-1]);
            }
        }
    }
    // pair first
    for(int i = 1; i <= m; i++) {
        for(int j : where[i]) {
            curr--; rem(a[j]);
            if(j % 2 == 0) {
                // from left
                if(j == n-1) continue; // not part of a pair
                if(a[j+1] != i) rem(a[j+1]);
            }
            else {
                // from right
                if(j == 0) continue; // not part of a pair
                if(a[j-1] != i) rem(a[j-1]);
            }
        }
        ans[i] = min(ans[i], curr-mxcnt);
        for(int j : where[i]) {
            curr++; add(a[j]);
            if(j % 2 == 0) {
                // from left
                if(j == n-1) continue; // not part of a pair
                if(a[j+1] != i) add(a[j+1]);
            }
            else {
                // from right
                if(j == 0) continue; // not part of a pair
                if(a[j-1] != i) add(a[j-1]);
            }
        }
    }
    for(int i = 1; i <= m; i++) {
        cout << ans[i] << "\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...