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过本题的神犇,也拜谢帮助我的神犇。