简单二分75pts求调
查看原帖
简单二分75pts求调
550107
cyh_qwq楼主2024/8/3 19:35
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
int n,m;
ll ans,t[N],maxx,res;
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
	return x*f;
}
inline void write(ll x){
	register int len=1,i;
	register char ch[1001];
	if(x==0){
		putchar('0');
		return;
	}
	if(x<0){
		putchar('-');
		x=-x;
	}
	while(x>0){
		ch[len++]=x%10+'0';
		x/=10;
	}
	len--;
	for(i=len;i>=1;--i)putchar(ch[i]);
}
int main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	register int i,x,y;
	register bool fl;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i){
		t[i]=read();
	}
	if(n==1){
		printf("%d\n",m);
		return 0;
	}
	fl=0;
	sort(t+1,t+1+n);
	for(i=1;i<=n;++i){
		x=0,y=0;
		if(t[i-1]+m-1>=t[i]&&i!=1)x=lower_bound(t+1,t+i,t[i]-m+1)-t,fl=1;
		if(t[i]+m-1>=t[i+1]&&i!=n)y=upper_bound(t+i+1,t+1+n,t[i]+m-1)-t-1,fl=1;
		if(i==1){
			if(y==i+1)maxx=t[i]+m-t[i+1],ans+=(m-maxx);
			else ans+=(min(t[1]+m-1,t[2]-1)-t[1]+1);
		}
		else if(i==n){
			if(x==i-1)maxx=max(maxx,t[i-1]+m-t[i]),ans+=(m-(t[i-1]+m-t[i]));
			else ans+=(t[i]+m-max(t[i],t[i-1]+m));
		}
		else{
			res=0;
			if(y==i+1)res+=t[i]+m-max(t[i+1],t[i-1]+m);
			if(x==i-1)res+=min(t[i-1]+m,t[i+1])-t[i];
			if(t[i-1]+m-1<t[i+1])ans+=min(t[i+1]-1,t[i]+m-1)-max(t[i-1]+m,t[i])+1;
			maxx=max(maxx,res);
		}
	}
	printf("%lld\n",ans+maxx+fl*m);
	return 0;
}

rt,具体思路是覆盖为一的时刻加上去掉之后增加的覆盖为一的时刻最多的玫瑰加 mm ,假了吗?

2024/8/3 19:35
加载中...