最慢点958ms求卡
查看原帖
最慢点958ms求卡
1100612
Gaoxing233楼主2024/8/3 19:15
#include <bits/stdc++.h>
using namespace std;
const int maxn=6e5+10;
int n,m,s[maxn],e[maxn],d[maxn],p[maxn],cnt=0,sum=0;
long long pre[maxn],t=0,ans=0;
map<int,int> mp,re;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&s[i]);
		e[i]=s[i]+m-1;
		mp[s[i]]++,mp[e[i]]++,mp[e[i]+1]++;
	}
	for(auto i=mp.begin();i!=mp.end();i++)
	{
		i->second=(++cnt);
		re[cnt]=i->first;
	}
	re[cnt+1]=re[cnt]+1;
	for(int i=1;i<=n;i++)
	{
		s[i]=mp[s[i]],e[i]=mp[e[i]];
		sum=max(sum,e[i]);
		d[s[i]]++,d[e[i]+1]--;
	}
	for(int i=1;i<=sum;i++)
	{
		p[i]=p[i-1]+d[i];
		if(p[i]==1)
		{
			ans+=re[i+1]-re[i];
		}
	}
	for(int i=1;i<=sum;i++)
	{
		if(p[i]==2) p[i]=-1;
		if(p[i]>=3) p[i]=0;
		pre[i]=pre[i-1]+p[i]*(re[i+1]-re[i]);
	}
	for(int i=1;i<=n;i++)
	{
		t=max(t,re[e[i]]-re[s[i]]+1-pre[e[i]]+pre[s[i]-1]);
	}
	printf("%lld",ans+t);
	return 0;
}
2024/8/3 19:15
加载中...