50pts 求调
查看原帖
50pts 求调
741244
Eason_cyx大愚若智楼主2024/8/3 20:36

rt,之前帖子里的 Hack 过了,于是变成了 50pts。

#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;
	wt[1] = a[2] - a[1];
	wt[n] = a[n] - a[n-1];
//	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)-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] + 1;
				if((i-2) != 0) {
					if((a[i-2]+m-1) >= a[i]) siz -= (a[i-2]+m-1) - a[i] + 1;
				}
			} 
		}
		if((i+1) != n+1) {
			if((a[i]+m-1) >= a[i+1]) {
				siz += (a[i]+m-1) - a[i+1] + 1;
				if((i+2) != n+1) {
					if((a[i]+m-1) >= a[i+2]) {
						siz -= (a[i]+m-1) - a[i+2] + 1;
					}
				}
			}
		}
		if((i-1) != 0 && (i+1) != n+1) siz -= max(0,(a[i-1]+m-1)-a[i+1]+1)*2;
//		cout << siz << endl;
		ans = max(ans,cnt-wt[i]+siz+m);
	}
	cout << ans << endl;
	return 0;
}
2024/8/3 20:36
加载中...