bzoj1150 堆應用,好題
阿新 • • 發佈:2019-01-10
#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); }