仅第一个测试点WA,求找错
查看原帖
仅第一个测试点WA,求找错
651883
hwh_qwq楼主2025/7/31 14:45

代码可读性比较低,可以说一下这题有什么坑,我再看看有没有注意到qwq。

#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int inf=1000000000000000001;
int n,m,a[200005],ans,rans;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	if(n<=2){
		cout<<n*m;
		return 0;
	}
	sort(a+1,a+n+1);
	a[0]=-m; a[n+1]=a[n]+m;
	for(int i=1;i<=n;i++){
		ans+=max((long long)0,min(a[i+1]-1,a[i]+m-1)-max(a[i-1]+m,a[i])+1);
	}
	for(int i=1;i<=n;i++){
		int s1=0,s2=0;
		s1=max((long long)0,min(a[i+1]-1,a[i]+m-1)-max(a[i-1]+m,a[i])+1);
		if(i==1) s2=max((long long)0,min(a[i+2]-1,a[i]+m-1)-a[i+1]+1);
		else if(i==n) s2=max((long long)0,a[i-1]-max(a[i-2]+m,a[i-1])+1);
		else{
			int l2,r2;
			if(a[i-1]+m-1<a[i]) l2=0;
			else l2=max((long long)0,min(a[i-1]+m-1,a[i+1]-1)-max(a[i],a[i-2]+m)+1);
			if(a[i]+m-1<a[i+1]) r2=0;
			else r2=max((long long)0,min(a[i]+m-1,a[i+2]-1)-max(a[i-1]+m,a[i+1])+1);
			s2=l2+r2;
		}
		if(ans+m+s2-s1>rans) rans=ans+m+s2-s1;
	}
	cout<<rans;
	return 0;
}
2025/7/31 14:45
加载中...