Submission #1014114

#TimeUsernameProblemLanguageResultExecution timeMemory
1014114snpmrnhlolRope (JOI17_rope)C++17
100 / 100
426 ms33640 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
const int inf = 2e9;
int n,k;
int v[N];
int f[N];
int p[N];
int ans[N];
pair<int,int> special[N];
int cnt;
int get(pair<int,int>a){
    int l = 0,r = cnt - 1;
    if(cnt == 0)return 0;
    while(l != r){
        int mij = (l + r)/2;
        if(special[mij] < a)l = mij + 1;
        else r = mij;
    }
    while(r < cnt && special[r] == a){
        r++;
    }
    return r - l;
}
void solve(int l, int r){
    cnt = 0;
    for(int i = l;i < r;i+=2){
        if(v[i] != v[i + 1]){
            special[cnt++] = {min(v[i],v[i + 1]),max(v[i],v[i + 1])};
        }
    }
    sort(special,special + cnt);
    for(int i = 0;i < k;i++){
        for(int j = 0;j < k;j++){
            if(i == p[j])continue;
            int nr = get({min(i,p[j]),max(i,p[j])});
            //cout<<l<<' '<<r<<' '<<i<<' '<<j<<' '<<p[j]<<' '<<n<<' '<<nr<<' '<<n - f[p[j]] - f[i] - nr<<'\n';
            ans[i] = min(ans[i],n - f[p[j]] - f[i] + nr);
            if(nr == 0)break;
        }
    }
}
int main(){
    cin>>n>>k;
    for(int i = 0;i < n;i++){
        cin>>v[i];
        v[i]--;
        f[v[i]]++;
        ans[i] = inf;
        p[i] = i;
    }
    sort(p,p + k,[&](int a,int b){
         return f[a] > f[b];
    });
    if(n%2 == 0){
        solve(0,n - 1);
        if(n >= 2)solve(1,n - 2);
    }else{
        solve(0,n - 2);
        solve(1,n - 1);
    }
    for(int i = 0;i < k;i++){
        ans[i] = min(ans[i],n - f[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...