#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
int pos;
long long val;
bool operator < (const node &b) const
{
return val<b.val;
}
};
priority_queue<node> q;
long long read()
{
long long s=0,f=1;
char in=getchar();
while(in<'0'||in>'9')
{
if(in=='-')
f=-1;
in=getchar();
}
while(in>='0'&&in<='9')
{
s=(s<<1)+(s<<3)+in-'0';
in=getchar();
}
return s*f;
}
long long value[500100];
long long data[500100];
long long lef[500100];
long long righ[500100];
bool vis[500100];
int main()
{
long long n=read(),k=read();
for(int i=1;i<=n;i++)
{
data[i]=read();
lef[i]=i-1;
righ[i]=i+1;
}
lef[n+1]=n;
righ[0]=1;
node pas;
for(int i=1;i<=n;i++)
{
pas.pos=i;
pas.val=data[i];
q.push(pas);
}
long long ans=0;
while(k--)
{
while(vis[q.top().pos])
q.pop();
pas=q.top();
q.pop();
if(pas.val<0)
break;
ans+=pas.val;
data[pas.pos]=data[lef[pas.pos]]+data[righ[pas.pos]]-data[pas.pos];
pas.val=data[pas.pos];
vis[lef[pas.pos]]=vis[righ[pas.pos]]=true;
lef[pas.pos]=lef[lef[pas.pos]];
righ[lef[pas.pos]]=pas.pos;
righ[pas.pos]=righ[righ[pas.pos]];
lef[righ[pas.pos]]=pas.pos;
q.push(pas);
}
printf("%lld",ans);
}
原文地址:https://www.cnblogs.com/Lance1ot/p/8877732.html
时间: 2024-10-08 20:45:56