本地可过编译+过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);
}