具体操作是把所有坑扔到优先队列中,假设当前拿出的最大坑是x
神仙题
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e5+10;
struct p{
ll v,id;
bool operator < (const p&tmp ) const{
return v<tmp.v;
}
};
priority_queue<p>q;
ll a[maxn],l[maxn],r[maxn],n,m,ok[maxn],ans;
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> a[i];
l[i]=i-1,r[i]=i+1;
q.push( (p){a[i],i} );
}
r[0]=1,l[n+1]=n;
while( m-- )
{
while( ok[q.top().id] ) q.pop();
p t=q.top(); q.pop();
if( t.v<0 ) break;
ans+=t.v;//加上贡献
int x=t.id;
a[x]=a[ l[x] ]+a[ r[x] ]-a[x];
t.v=a[x];
ok[l[x]]=ok[r[x]]=1;
l[x]=l[l[x]],r[l[x]]=x;
r[x]=r[r[x]];l[r[x]]=x;
q.push(t);
}
cout<<ans;
}