GDOI2014模擬 伺服器

2021-07-13 11:12:09 字數 1518 閱讀 3002

直到比賽最後幾分鐘,才發現60%資料居然是乙個水dp,結果沒打完。

我們需要將乙個檔案複製到n個伺服器上,這些伺服器的編號為s1, s2, …, sn。

首先,我們可以選擇一些伺服器,直接把檔案複製到它們中;將檔案複製到伺服器si上,需要花費ci > 0的置放費用。對於沒有直接被複製檔案的伺服器si來說,它依次向後檢查si+1, si+2, …直到找到一台伺服器sj:sj中的檔案是通過直接複製得到的,於是si從sj處間接複製得到該檔案,這種複製方式的讀取費用是j – i(注意j>i)。另外,sn中的檔案必須是通過直接複製得到的,因為它不可能間接的通過別的伺服器進行複製。我們設計一種複製方案,即對每一台伺服器確定它是通過直接還是間接的方式進行複製(sn只能通過直接方式),最終使每一台伺服器都得到檔案,且總花費最小。

60%的資料

水dp,設f[

i]表示直接複製檔案給

i ,把檔案複製到i~n中的所有伺服器最小的花費。

顯然,轉移為f[

i]=c

[i]+

min(f[

j]+(

1+j−

(i+1

))∗(

j−(i

+1))

/2).

100%的資料

現在就要想辦法給dp加斜率優化了。

有兩個位置j和

k(j!

=k並且

ik),要使選

j 比

k優, 那麼f

[j]+

(1+j

−(i+

1))∗

(j−(

i+1)

)2k]+(

1+k−

(k+1

))∗(

j−(k

+1))

2 移項得f[j

]−f[

k]+(

j2−k

2+k−

j)/2

j−k接著就可以打斜率優化dp了。

#include 

#include

#include

#include

#include

#include

#include

const

long

long maxlongint=214748364700;

using

namespace

std;

long

long f[200000],n,m,c[200000],d[200000];

long

long sum(long x,long y)

double slope(long

long x,long

long y)

int main()

f[n]=c[n];

long

long l,r;

d[l=r=1]=n;

for(long

long i=n-1;i>=1;i--)

GDOI2014模擬 伺服器

我們可以從n個數中選擇一些,選擇第i個數的代價為ci,且必須選擇n。對於每個沒有被選擇的數i,若它右邊離它最近的乙個被選擇的數是j,則代價為j i。求最小代價。n 10 6 n 2dp還是很顯然的。設fi表示i必須選,且i的右邊已經搞定了的最小代價,那麼fi min fk k i 1 k i 2 c...

GDOI2014模擬 網格

description 某城市的街道呈網格狀,左下角座標為a 0,0 右上角座標為b n,m 其中n m。現在從a 0,0 點出發,只能沿著街道向正右方或者正上方行走,且不能經過圖示中直線左上方的點,即任何途徑的點 x,y 都要滿足x y,請問在這些前提下,到達b n,m 有多少種走法。輸入檔案中僅...

GDOI2014模擬 雨天的尾巴

給出乙個n個節點的樹和m次操作,每次操作把x到y的路徑上的所有的點的z種物品 1.求最後每個點最多的物品編號。若有多個相同的取編號小的,若沒有則輸出0.n,m 10 5,z 10 9 include include include include include define fo i,a,b fo...