Submission #991323

#TimeUsernameProblemLanguageResultExecution timeMemory
991323irmuunRope (JOI17_rope)C++17
100 / 100
1713 ms147196 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n,m;
    cin>>n>>m;
    ll c[n+5];
    vector<ll>pos[m+5],cnt(m+5,0);
    for(ll i=1;i<=n;i++){
        cin>>c[i];
        cnt[c[i]]++;
        pos[c[i]].pb(i);
    }
    vector<ll>even(m+5,0),odd(m+5,0);
    multiset<ll,greater<ll>>C;
    for(ll i=1;i<=m;i++){
        C.insert(cnt[i]);
    }
    for(ll i=1;i<=m;i++){
        set<ll>st;
        for(ll p:pos[i]){
            if(p>1&&c[p-1]!=i){
                if(p%2==0) even[c[p-1]]++;
                else odd[c[p-1]]++;
                st.insert(c[p-1]);
            }
            if(p<n&&c[p+1]!=i){
                if(p%2==1) even[c[p+1]]++;
                else odd[c[p+1]]++;
                st.insert(c[p+1]);
            }
        }
        ll ans=n;
        C.erase(C.find(cnt[i]));
        for(ll x:st){
            ans=min(ans,n-cnt[i]-cnt[x]+min(odd[x],even[x]));
            C.erase(C.find(cnt[x]));
        }
        if(!C.empty()){
            ans=min(ans,n-cnt[i]-*C.begin());
        }
        ans=min(ans,n-cnt[i]);
        cout<<ans<<'\n';
        for(ll x:st){
            odd[x]=0;
            even[x]=0;
            C.insert(cnt[x]);
        }
        C.insert(cnt[i]);
    }
}
#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...