rt,调了很久,不知道问题在哪。
思路同第一篇题解。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=300010;
int n,m,a[N];
struct Link
{
int l,r,val;
bool d=0;
}link[N];
inline void del(int x)
{
link[link[x].l].r=link[x].r;
link[link[x].r].l=link[x].l;
link[x].r=link[x].l=link[x].val=-1;
link[x].d=true;//标记删除
}
priority_queue<pair<int,int> > q;
long long ans;
int main()
{
scanf("%d%d",&n,&m);
if(n<m*2)
{
printf("Error!");
return 0;
}
for(int i=1;i<=n;++i) scanf("%d",&a[i]),q.push(make_pair(a[i],i)),link[i].val=a[i],link[i].l=i-1,link[i].r=i+1;
link[1].l=n,link[n].r=1;
int cnt=0,idx=n;
while(!q.empty()&&q.top().first&&cnt<m)
{
while(!q.empty()&&link[q.top().second].d) q.pop();//弹出已经被删掉的
if(q.empty()) break;
auto u=q.top();q.pop();
if(u.second<=0) break;
ans+=u.first;
link[u.second].val=link[link[u.second].l].val+link[link[u.second].r].val-link[u.second].val;
q.push(make_pair(link[u.second].val,u.second));
del(link[u.second].l),del(link[u.second].r);
++cnt;
}
printf("%lld",ans);
return 0;
}