题目描述
解题代码
注意事项:这道题的时间卡的太死,输入输出最好使用scanf与printf,或者使用加速代码的cin与cout,否则会超时。
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
struct part{
ll num;
int id;
part(ll x,int y){
num=x;
id=y;
}
};
struct cmp{
bool operator()(part a,part b){
if(a.num==b.num) return a.id>b.id;
return a.num>b.num;
}
};
int main(){
int n,k;
scanf("%d %d",&n,&k);
priority_queue<part,vector<part>,cmp>p;
int after[n+1]={};
int before[n+1]={};
ll num[n+1]={};
int del[n+1]={};
for(int i=1;i<=n;i++){
scanf("%lld",&num[i]);
after[i]=i+1;
before[i]=i-1;
p.push(part(num[i],i));
}
while(k--){
part a=p.top();
p.pop();
int i=a.id;
if(del[i]!=0){
k++;
del[i]--;
continue;
}else{
del[i]=-1;
}
int r=after[i];
int l=before[i];
num[r]+=num[i];
num[l]+=num[i];
p.push(part(num[r],r));
p.push(part(num[l],l));
del[r]++;del[l]++;
after[l]=r;
before[r]=l;
}
for(int i=1;i<=n;i++){
if(del[i]!=-1){
printf("%lld ",num[i]);
}
}
return 0;
}