bzoj1150 堆应用,好题

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define INF 0x3fffffff
#define pa pair<int,int>

int n,k,pre[maxn],nxt[maxn],len[maxn];
priority_queue<pa,vector<pa>,greater<pa> >q;

int main(){
    scanf("%d%d",&n,&k);
    int now,last=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&now);
        len[i]=now-last;
        last=now;
        pre[i]=i-1;nxt[i]=i+1;
    }//len[1]是没用的 
    pre[2]=0,nxt[n]=0;
    for(int i=2;i<=n;i++)
        q.push(make_pair(len[i],i));
    int ans=0;
    while(k--){
        while(q.top().first!=len[q.top().second])
            q.pop();//这一步不能省略 
        pa tmp=q.top();q.pop();
        int pos=tmp.second;
        int l=pre[pos],r=nxt[pos];
        ans+=tmp.first;
        pre[nxt[pos]=nxt[r]]=pos;
        nxt[pre[pos]=pre[l]]=pos;
        len[pos]=l&&r?min(INF,len[l]+len[r]-len[pos]):INF;
        len[l]=len[r]=INF;
        q.push(make_pair(len[pos],pos));
    }
    printf("%d\n",ans);
}

 

posted on 2019-01-09 23:54  zsben  阅读(170)  评论(0编辑  收藏  举报

导航