1. 程式人生 > >bzoj1150 堆應用,好題

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); }