# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1180055 | Szymon_Pilipczuk | Rope (JOI17_rope) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std
#define ll long long
ll tr[2000000];
ll n,m;
void add(ll p,ll v)
{
p+=m;
tr[p]+=v;
p/=2;
while(p > 0)
{
tr[p] = max(tr[p*2],tr[p*2+1]);
p/=2;
}
}
ll check()
{
return tr[1];
}
int main()
{
cin>>n>>m;
ll c[n];
vector<ll> mm(m,0);
vector<vector<ll>> p1(m);
vector<vector<ll>> p2(m);
for(int i =0 ;i<n;i++)
{
cin>>c[i];
c[i]--;
mm[c[i]]++;
add(c[i],1);
}
for(int i = 0;i<n;i++)
{
if(i > 0)
{
if(c[i-1] != c[i])
{
if(i%2 == 0)
{
p2[c[i]].push_back(c[i-1]);
}
else
{
p1[c[i]].push_back(c[i-1]);
}
}
}
if(i < n-1)
{
if(c[i+1] != c[i])
{
if(i%2 == 0)
{
p1[c[i]].push_back(c[i+1]);
}
else
{
p2[c[i]].push_back(c[i+1]);
}
}
}
}
for(int i = 0;i<m;i++)
{
for(int j = 0;j<p1[i].size();j++)
{
add(p1[i][j],-1);
}
add(i,-1e9);
ll ans = n-check()-mm[i];
for(int j = 0;j<p1[i].size();j++)
{
add(p1[i][j],1);
}
for(int j = 0;j<p2[i].size();j++)
{
add(p2[i][j],-1);
}
ans = min(ans,n-check()-mm[i]);
for(int j = 0;j<p2[i].size();j++)
{
add(p2[i][j],1);
}
add(i,1e9);
cout<<ans<<"\n";
}
}