堆優化DP 征途堆積出友情的永恆

2021-08-09 05:35:33 字數 1454 閱讀 6644

可以在當前的城市上車,並且在之後的某一座城市下車。從第(i-1)座乘坐到第i座需要花費ai。在第i座城市上車需要繳納bi的稅款如果連續地乘坐一段費用大於這次上車前所需繳納的稅款,則這次上車前的稅款可以被免除,否則免去乘坐這段火車的費用。

每一次乘坐都不能連續經過超過k座城市(不包括上車時所在的城市),所以,從0~n的最小花費是多少?

【資料範圍】

20%的資料滿足,n≤30,k≤5。

50%的資料滿足,n≤10000,k≤1000。

另有10%的資料滿足,bi = 1。

另有10%的資料滿足,ai = b(i-1)。

另有10%的資料滿足,n = k。

100%的資料滿足,n≤500000,k≤100000,1≤ai,bi≤10^6。

前50% o(n*k)

再30% 特判

100%:堆優化dp

很明顯,f[i]=min(f[j]+max(b[j],sum[i]-sum[j]));

對於j,f[j]+b[j]和f[j]-sum[j]都是確定的,

那麼維護兩個小根堆,維護啥,就在上面。

因為在b[j]>sum[i]-sum[j]時第乙個堆裡的元素才會合法,所以首先把所有堆1裡不合法的pop,但要把它推入堆2.

上面那個操作之前,之後,都要pop在距離上》k的點。

#include 

#include

#include

#include

#include

#include

#define n (int)5e5+10

#define inf 100000000000000ll

#define ll long long

using

namespace

std;

int n,k;ll f[n],a[n],b[n],sum[n];

struct node

node(int x_,ll h_)

friend

bool

operator

<(node x,node y)

};priority_queueq1,q2;

int main()

); while(!q1.empty())

while(!q2.empty())

while(!q1.empty()));}

while(!q1.empty())

while(!q2.empty())

ll tmp=999990000000000000ll;

if(!q1.empty())tmp=min(tmp,q1.top().h);

if(!q2.empty())tmp=min(tmp,q2.top().h+sum[i]);

f[i]=tmp;

}cout

<}

dijkstra 堆優化 路徑

別人給的模板,所以不知道鏈結 include include include include include using namespace std define maxn 1020 define inf 0x3f typedef long long ll o nlogn typedef pair ...

索引堆的優化

之前的change函式如下 希望將索引為i的元素的值修改為 newitem void change int i,item newitem 優化思路 實現 include include include include include include include include using nam...

模板 dijkstra 堆優化

複雜度o mlogn 輸入起點s,可以得到從起點到各點的最短路距離陣列dis i 1.初始化 清空標記陣列,初始化距離陣列設為inf,起點距離設為0,開優先佇列,搜尋起點 2.搜尋 取出隊首並pop,如果隊首節點u的當前最短路比u的原先的最短路大則跳過,否則遍歷u的鄰接點如果v沒有被訪問過且u的最短...