codeforces E. Sorting Books
E. Sorting Books
- 题意
给你
-
solution
我们可以发现 ,最优解一定是某种颜色因为移动或抽出中间的其他颜色使其相连,贪心发现某个颜色连成一片有一下两种方式 : 1.直接将所有的相同颜色移动到队伍末尾 2. 将某个颜色前缀的某些书移动到队伍末尾再将完成后中间其他颜色移动于末尾 。正难则反,让我们求最少的移动量,我们可以先求最大的保留量,显然两个颜色如果都要保留,则它们不可相交(最左,最右)+个数为权值 。因此我们可以先将所有区间处理出然后
-
code
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
int a[maxn],n,f[maxn],id[maxn],num,ans,N,sum[maxn];
struct node
{
int l,r,w;
}t[maxn];
bool cmp(node a,node b) {
return a.l<b.l;
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i) {
scanf("%d",&a[i]);if(!id[a[i]]) id[a[i]]=++num;if(!t[id[a[i]]].l) t[id[a[i]]].l=i;t[id[a[i]]].r=i;t[id[a[i]]].w++;
}
int now=1;
for(int i=n;i;i--) {
sum[a[i]]++;
t[++num].l=i;t[num].r=n;t[num].w=sum[a[i]];
}
sort(t+1,t+num+1,cmp);
for(int i=1;i<=n;++i) {
while(t[now].l==i) {
f[t[now].r+1]=max(f[t[now].r+1],f[i]+t[now].w);now++;
}
f[i+1]=max(f[i+1],f[i]);
}
cout<<n-f[n+1]<<"\n";
return 0;
}
/*
10
9 8 7 3 6 3 10 9 9 3
*/