萌新第一天学OI,这题太难了,20pts求调
查看原帖
萌新第一天学OI,这题太难了,20pts求调
917775
_buzhidao_楼主2024/8/3 20:24

record
为什么越交分越少
20pts 代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,t[200005],s[200005];
ll ans,maxs;
//ll rtm[200005];//test
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i) scanf("%lld",t+i);
	sort(t+1,t+n+1);
	t[n+1]=t[n+2]=t[n]+m;t[0]=-m;
	for(int i=1;i<=n;++i){//cal s&ans
		ll tmp=0;
		if(t[i+1]>=t[i]+m){
			tmp=m;
		}
		else if(t[i+2]<t[i]+m){
			tmp=t[i+1]-t[i];
			s[i]+=t[i+2]-t[i+1];
			s[i+1]+=t[i+2]-t[i+1];
		}
		else{
			if(t[i+1]<t[i-1]+m){//touch in
				s[i]-=t[i-1]+m-t[i+1];
				s[i+1]-=t[i-1]+m-t[i+1];
			}
			tmp=t[i+1]-t[i];
			s[i]+=m-t[i+1]+t[i];
			s[i+1]+=m-t[i+1]+t[i];
		}
		if(t[i-1]>t[i]-m) tmp-=t[i-1]+m-t[i];
		tmp=max(tmp,0ll);
		ans+=tmp;
		//rtm[i]=tmp;//test
	}
	//ans-=m+t[n-1]-t[n];
	/*
	for(int i=1;i<=n;++i){//test
		cout<<t[i]<<' ';
	}
	cout<<endl<<ans<<endl;//test
	for(int i=1;i<=n;++i){//test
		cout<<rtm[i]<<' ';
	}
	*/
	for(int i=1;i<=n;++i){
		maxs=max(maxs,s[i]);
	}
	ans+=maxs+m;
	cout<<ans;
	return 0;
}

拜谢A过本题的神犇,也拜谢帮助我的神犇。

2024/8/3 20:24
加载中...