rt,比赛时写了个按块枚举的做法,20分,同机房的却暴力100分过了,有点想不通我的这个为什么不可行
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
struct blocker{
int num,st,ed,id;
}blsz[1000005];
bool cmp(blocker x,blocker y){
if(x.num != y.num)return x.num > y.num;
return x.id > y.id;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int t;
cin >> t;
while(t--){
int n,m,k;
int block = 0,ans = 0,color = 0;
cin >> n >> m >> k;
memset(blsz,0,sizeof(blsz));
for(register int i = 1;i <= n;++i){
cin >> a[i];
if(a[i] != a[i - 1]){
blsz[++block].num = 1;
blsz[block].st = i;
blsz[block - 1].ed = i - 1;
blsz[block].id = i;
}
else ++blsz[block].num;
}
ans = block;
color = block;
int cz = 0;
int f = 2;
sort(blsz + 1,blsz + n + 1,cmp);
for(register int i = 1;i <= block && cz <= m;i++){
if(blsz[i].num > 2){
if(2 <= k && cz + blsz[i].num - 2 <= m){
ans += blsz[i].num - 1;
cz += blsz[i].num - 2;
}
else{
ans++;
for(register int j = 1;j <= m-cz;j++){
ans ++;
}
break;
}
}
else if(blsz[i].num == 2){
int gs = a[blsz[i].ed + 1] != a[blsz[i].st - 1];
if(gs <= k && cz + 1 <= m){
++ans;
++cz;
}
}
}
cout << ans << '\n';
}
return 0;
}