求助
作者:
1849399548
,
2024-03-12 22:25:53
,
所有人可见
,
阅读 45
#include<iostream>
#include<queue>
using namespace std;
#define x first
#define y second
const int N=500010;
typedef long long ll;
typedef pair<ll,int >pll;
ll l[N],r[N];
ll e[N];
int n,k;
void delect(ll k){
l[r[k]]=l[k];
r[l[k]]=r[k];
//更新值
e[l[k]]+=e[k];
e[r[k]]+=e[k];
}
int main(){
cin>>n>>k;
r[0]=1;
l[n+1]=n;
priority_queue<pll,vector<pll>,greater<pll> >heap;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
e[i]=x;
//为什么这里必须把e[i]放前面,把i放在first的位置上会导致右边的值不更新
heap.push({e[i],i});
//heap.push({i,e[i]});
l[i]=i-1,r[i]=i+1;
}
while(k--){
auto t=heap.top();
heap.pop();
ll id=t.y;
ll value=t.x;
if(e[id]!=value){
// e[id]=value;
k++;
heap.push({e[id],id});
}else{
delect(id);
}
}
for(int i=r[0];i!=n+1;i=r[i]){
printf("%lld ",e[i]);
}
return 0;
}