//#define local
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int MAXN=1e5+5;//人数 n
#define MAXM 22//队数 m
#define INF 0x7fffffff
int dp[1<<MAXM];
int sum[MAXN][MAXM]={0};//sum[i][j]表示下标i及其前方有j队多少人
int num[MAXM]={0};
int n,m;
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i){
int t;
scanf("%d",&t);
--t;
++num[t];
if(i!=0){
for(int j=0;j<m;++j)
sum[i][j]=sum[i-1][j];
}
++sum[i][t];
}
fill(dp,dp+(1<<m),INF);
dp[0]=0;
for(ll i=1;i<(1<<m);++i){
int len=0;
for(int j=0;j<m;++j){
if(i&1<<j)
len+=num[j];
}
for(int j=0;j<m;++j){
if(i&1<<j){
int r=len-1;
int l=len-num[j]-1;
dp[i]=min(dp[i],dp[i-(1<<j)]+num[j]-(sum[r][j]-sum[l][j]));
}
}
}
printf("%d",dp[(1<<m)-1]);
return 0;
}
P3694 邦邦的大合唱队
最新推荐文章于 2024-09-25 10:19:07 发布