基础赛 C 求调
  • 板块学术版
  • 楼主Eason_cyx大愚若智
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/3 18:08
  • 上次更新2024/8/3 19:30:16
查看原帖
基础赛 C 求调
741244
Eason_cyx大愚若智楼主2024/8/3 18:08

rt

#include <bits/stdc++.h>
using namespace std;
map<int,bool> mp;
int a[200005],wt[200005],tw[200005];
int main() {
	int n,m; cin >> n >> m;
	if(n == 1) {
		cout << m << endl;
		return 0;
	}
	else if(n == 2) {
		cout << 2 * m << endl;
		return 0;
	}
	for(int i = 1;i <= n;i++) {
		cin >> a[i];
	}
	sort(a+1,a+n+1);
	a[0] = -m; a[n+1] = 2100000000;
	int cnt = (a[2] - a[1]) + (a[n] - a[n-1]);
	int ans = 0;
//	for(int i = 1;i <= n;i++) cout << a[i] << " \n"[i == n];
	for(int i = 2;i < n;i++) {
		if((a[i-1]+m-1) >= a[i] && a[i+1] <= a[i]+m-1) {cnt += max(0,a[i+1]-(a[i-1]+m-1)); wt[i] = max(0,a[i+1]-(a[i-1]+m-1));}
		else if((a[i-1]+m-1) >= a[i] && a[i+1] > a[i]+m-1) {cnt += a[i]-a[i-1]; wt[i] = a[i]-a[i-1];}
		else if((a[i-1]+m-1) < a[i] && a[i+1] <= a[i]+m-1) {cnt += a[i+1]-a[i]; wt[i] = a[i+1]-a[i];}
		else {cnt += m; wt[i] = m; }
	}
//	for(int i = 1;i <= n;i++) cout << wt[i] << " \n"[i == n];
//	cout << cnt << endl << endl;
	for(int i = 1;i <= n;i++) {
		int siz = 0; //将当前的线段去掉之后新增的空白部分
		if((i-1) != 0) {
			if(a[i] <= (a[i-1]+m-1)) {
				siz += (a[i-1]+m-1) - a[i];
				if((i-2) != 0) {
					if((a[i-2]+m-1) >= a[i]) siz -= (a[i-2]+m-1) - a[i];
				}
			} 
		}
		if((i+1) != n+1) {
			if((a[i]+m-1) >= a[i+1]) {
				siz += (a[i]+m-1) - a[i+1];
				if((i+2) != n+1) {
					if((a[i]+m-1) >= a[i+2]) {
						siz -= (a[i]+m-1) - a[i+2];
					}
				}
			}
		}
		if((i-1) != 0 && (i+1) != n+1) siz -= max(0,(a[i-1]+m-1)-a[i+1])*2;
//		cout << siz << endl;
		ans = max(ans,cnt-wt[i]+siz+m);
	}
	cout << ans << endl;
	return 0;
}
2024/8/3 18:08
加载中...