1. 程式人生 > 實用技巧 >Abp vNext 實戰 - 2修改DBMS執行專案

Abp vNext 實戰 - 2修改DBMS執行專案

連結:Miku

--------------------------------

連結串列存圖,但是要注意創造出來個0和n+1號坑,這會方便我們後續處理的

--------------------------------

貪心的部分就是選擇最高的,然後把兩邊的去掉

等等,我反悔了咋辦,我覺得選兩邊的更好!(這裡有一個問題,要不都選,要不都不選,這是可以證明的)

那麼我們就把兩邊和中間拼成一顆巨樹,他的價值是兩邊之和-中間的(這樣再選它,就正好是抵消中間並且變成了兩邊的和)

然後優先佇列彈彈彈。

注意:這裡有負的,所有要特判。

----------------------------------

#include<iostream>
#include
<cstdio> #include<algorithm> #include<queue> using namespace std; int n,k; int l[500002],r[500002],num[500002];long long v[500002]; struct tr{ int l; int r; int num; long long va; friend bool operator < (tr a,tr b){ return a.va<b.va; } } t[500001],tt; long long
ans; long long x; priority_queue <tr>q; int fl[500001]; int main(){ scanf("%lld%lld",&n,&k); for(int i=1;i<=n;++i){ scanf("%lld",&x); t[i].va=x; t[i].l=i-1;f t[i].r=i+1; t[i].num=i; q.push(t[i]); } t[0].r=1;//省事之極 t[n+1
].l=n; for(int i=1;i<=k;++i){ while(!q.empty()&&(fl[q.top().num]))//不能選的踢出去 q.pop(); tt=q.top();q.pop(); if(tt.va<0) { break; } ans+=tt.va; x=tt.num; t[x].va=t[t[x].l].va+t[t[x].r].va-t[x].va;//額外開一個數組很有必要,不然找不到左右 tt.va=t[x].va; fl[t[x].l]=fl[t[x].r]=1;//兩邊踢出去 t[x].l=t[t[x].l].l;t[t[x].l].r=x;//把左右合併成巨坑 t[x].r=t[t[x].r].r;t[t[x].r].l=x; q.push(tt); } cout<<ans; return 0; }
Ac