40pts求调
查看原帖
40pts求调
1190404
Fengjunning31楼主2024/8/27 16:19
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2*1e5+5;
int n,m,cnt,ans,b[N];
int minn=LONG_LONG_MAX,min_idx;
int backf[15];
int back;
struct as{
	int s,t;
}d[N];
queue<as> q;

bool cmp(as x,as y){
	return x.s<y.s;
}

void work(int i){
	if(backf[1]){
		if(backf[1]+1>=d[i].s){
			b[cnt]=0;
		}
		else{
			b[cnt]=d[i].s-backf[1]-1;
		}
	}
	else{
		b[cnt]=min(b[cnt],d[i].s-back);
	}
	b[++cnt]=d[i].s-back;
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>d[i].s;
		d[i].t=d[i].s+m-1;
	}
	sort(d+1,d+n+1,cmp);
	//queue优化
	
	for(int i=1;i<=n;i++){
		if(d[i].s-back<m||q.empty()){
			if(!q.empty()){
				work(i);
			}
			else{
				b[++cnt]=m;
			}
			q.push({d[i].s,d[i].t});
			back=d[i].s;
			
			backf[1]=backf[2];
			backf[2]=d[i].t;

		}
		else{
			while(!q.empty()) q.pop();
			back=0;
			memset(backf,0,sizeof(backf));
			i--;
		}
	}
	for(int i=1;i<=n;i++){

		if(b[i]<minn){
			minn=b[i];
			min_idx=i;
		}
	}
	//update
	d[min_idx].s=d[n].t+1;
	d[min_idx].t=d[min_idx].s+m-1;
	//将要改的线段一直最后,再重新计数 
	sort(d+1,d+n+1,cmp);
	
	memset(b,0,sizeof(b));
	memset(backf,0,sizeof(backf));
	back=0;
	cnt=0;
	
	while(!q.empty()) q.pop();
	
	for(int i=1;i<=n;i++){
		if(d[i].s-back<m||q.empty()){
			if(!q.empty()){
				work(i);
			}
			else{
				b[++cnt]=m;
			}
			q.push({d[i].s,d[i].t});
			back=d[i].s;
			
			backf[1]=backf[2];
			backf[2]=d[i].t;

		}
		else{
			while(!q.empty()) q.pop();
			back=0;
			memset(backf,0,sizeof(backf));
			i--;
		}
	}
	for(int i=1;i<=n;i++){
		ans+=b[i];
	}
	cout<<ans;
	return 0;
}

求大佬调

2024/8/27 16:19
加载中...