题目大意
和上个题的唯一区别是,这个题要让数组和尽量小
题解
和前一天差不多,只不过判断条件改改就好了,还是看代码吧,Q^Q我的语言描绘能力太差了
#include<cstdio>
const int MAX=1e5+5;
int a[MAX];
int loc[MAX],next[MAX];
int anum,bnum;
int ans;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<=n;i++){
loc[i]=n+1;
}
for(int i=n;i>=0;i--){
next[i]=loc[a[i]];
loc[a[i]]=i;
}
for(int i=1;i<=n;i++){
if(a[anum]==a[bnum]){
ans+=a[bnum]!=a[i];
if(anum<bnum){
anum=bnum;
}
bnum=i;
}
else if(a[anum]==a[i]){
anum=i;
}else if(a[bnum]==a[i]){
bnum=i;
}else{
if(next[anum]<next[bnum]){
ans+=a[bnum]!=a[i];
bnum=i;
}else{
ans+=a[anum]!=a[i];
anum=i;
}
}
}
printf("%d\n",ans);
return 0;
}