求助
查看原帖
求助
540177
wyf_sinon楼主2024/3/21 19:54

本地可过编译+过45%数据 剩下WA

玄关

求助

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> PII ;
const int MAXN=1e6+10;
int n,K,idx;
int cal,lst;
int dis[MAXN];
int ans;
bool delet[MAXN*2];
priority_queue < PII , vector< PII > , greater< PII > > q ;
struct stu
{
	int enter=-1,pre=-1,edge=0;
}city[MAXN*2];
void init()
{
	for(int i=1;i<=n;i++)
	{
		q.push( {dis[i],i} ) ;
		if(i==1)
		{
			city[i].edge=dis[i];
			city[i].enter=i+1;
			continue;
		}
		else if (i==n)
		{
			city[i].edge=dis[i];
			city[i].pre=i-1;
			continue;
		}
		else
		{
			city[i].edge=dis[i];
			city[i].enter=i+1;
			city[i].pre=i-1;
			continue;
		}
	}
	idx=n;
}
signed main()
{
	scanf("%lld%lld",&n,&K);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&cal);
		if(i>1)  dis[i-1]=cal-lst;
		lst=cal;
	} n--;
	init();
	int cnt=0;
	while(cnt<K)
	{
		int val=q.top().first,index=q.top().second;
		q.pop();
		if(delet[index]) continue;
		ans+=val;
		if( city[index].pre!=-1 && city[index].enter!=-1 )
		{
			delet[city[index].pre]=1;delet[city[index].enter]=1;
			int PRE=city[city[index].pre].pre,NEXT=city[city[index].enter].enter;
			++idx;
			if(PRE!=-1)  city[PRE].enter=idx;
			if(NEXT!=-1) city[NEXT].pre=idx;
			city[idx].edge=city[city[index].enter].edge+city[city[index].pre].edge-val;
			city[idx].pre=PRE;
			city[idx].enter=NEXT;
		}
		else if(city[index].pre!=-1)
		{
			delet[city[index].pre]=1;
			int PRE=city[city[index].pre].pre;
			++idx;
			if(PRE!=-1)  city[PRE].enter=idx;
			city[idx].edge=city[city[index].pre].edge-val;
			city[idx].pre=PRE;
		}
		else
		{
			delet[city[index].enter]=1;
			int NEXT=city[city[index].enter].enter;
			++idx;
			if(NEXT!=-1) city[NEXT].pre=idx;
			city[idx].edge=city[city[index].enter].edge-val;
			city[idx].enter=NEXT;
		}
		q.push({city[idx].edge,idx});
		cnt++;
	}
	printf("%lld",ans);
}
2024/3/21 19:54
加载中...