我觉得没问题,可是只有 10pts
code:
#include<cstring>
#include<algorithm>
using namespace std;
int T;
const int N = 500010;
int a[N];
int f[N];
int bl[N];
int l[N] , r[N] , len[N];
int main(){
cin >> T;
while(T--){
int ans = 0;
int n , m , k;
scanf("%d%d%d" , &n , &m , &k);
for(int i = 1;i <= n;i++) scanf("%d" , &a[i]) , f[i] = bl[i] = l[i] = r[i] = len[i] = 0;
f[0] = f[n + 1] = -1;
l[0] = -1 , r[0] = -1;
int cnt = 0;
a[0] = -1;
for(int i = 1;i <= n;i++){
if(a[i] != a[i - 1]){
r[cnt] = i - 1;
f[++cnt] = a[i];
l[cnt] = i;
bl[i] = cnt;
}
else bl[i] = cnt;
}
r[cnt] = n;
for(int i = 1;i <= cnt;i++){
if(!m) break;
for(int j = l[i] + 1;j <= r[i] + 1;j += 2){
if(!m) break;
int d = a[j - 1];
int delta = 1;
while(delta <= k){
if(d + delta <= k && (d + delta) != a[j - 1] && (d + delta) != a[j + 1]){
d += delta;
break;
}
if(d - delta >= 1 && (d - delta) != a[j - 1] && (d - delta) != a[j + 1]){
d -= delta;
break;
}
delta++;
}
a[j] = d;
m--;
}
}
for(int i = 1;i <= n;i++) if(a[i] != a[i - 1]) ans++;
cout << ans << endl;
}
return 0;
}