月赛T2求助
  • 板块灌水区
  • 楼主Fwio_
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/9/23 18:16
  • 上次更新2023/11/2 18:28:58
查看原帖
月赛T2求助
965238
Fwio_楼主2023/9/23 18:16

我觉得没问题,可是只有 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;
}
2023/9/23 18:16
加载中...