BZOJ1835 ZJOI2010 基站選址

2022-09-18 09:03:24 字數 1575 閱讀 3769

原題傳送門

有n個村莊坐落在一條直線上,第i(i>1)個村莊距離第1個村莊的距離為di。需要在這些村莊中建立不超過k個通訊基站,在第i個村莊建立基站的費用為ci。如果在距離第i個村莊不超過si的範圍內建立了乙個通訊基站,那麼就成它被覆蓋了。如果第i個村莊沒有被覆蓋,則需要向他們補償,費用為wi。現在的問題是,選擇基站的位置,使得總費用最小。 輸入資料 (base.in) 輸入檔案的第一行包含兩個整數n,k,含義如上所述。 第二行包含n-1個整數,分別表示d2,d3,…,dn ,這n-1個數是遞增的。 第三行包含n個整數,表示c1,c2,…cn。 第四行包含n個整數,表示s1,s2,…,sn。 第五行包含n個整數,表示w1,w2,…,wn。

輸入檔案的第一行包含兩個整數n,k,含義如上所述。

第二行包含n-1個整數,分別表示d2,d3,…,dn ,這n-1個數是遞增的。

第三行包含n個整數,表示c1,c2,…cn。

第四行包含n個整數,表示s1,s2,…,sn。

第五行包含n個整數,表示w1,w2,…,wn。

輸出檔案中僅包含乙個整數,表示最小的總費用。

3 2

1 22 3 2

1 1 0

10 20 30

40%的資料中,\(n \leq 500\);

100%的資料中,\(k \leq n,k \leq 100 , n \leq 20000 , di \leq 10^ , ci \leq 10000,si \leq 10^9,wi \leq 10000\) 。

#include #define r register

#define mid (l+r>>1)

#define mn 20005

#define mm (1<<16)

#define inf 0x3f3f3f3f

inline int read()

int d[mn],t[mm],mark[mm],r[mn],c[mn],w[mn],st[mn],ed[mn],n,k,lk[mn],nxt[mn],head[mn],cnt,f[mn],ans=inf;

inline int min(int a,int b) pushdown(k);

if (a<=mid) update(l,mid,a,b,k<<1,ad);

if (b>mid) update(mid+1,r,a,b,k<<1|1,ad);

t[k]=min(t[k<<1],t[k<<1|1]);

}inline int query(int l,int r,int a,int b,int k)

int main()

for (r int i=1,sum=0; i<=n; ++i)

for (r int i=2; i<=k; ++i)

}printf("%d\n",f[n]);

return 0;

}

bzoj 1835 ZJOI2010 基站選址

有n個村莊坐落在一條直線上,第i i 1 個村莊距離第1個村莊的距離為di。需要在這些村莊中建立不超過k個通訊基站,在第i個村莊建立基站的費用為ci。如果在距離第i個村莊不超過si的範圍內建立了乙個通訊基站,那麼就成它被覆蓋了。如果第i個村莊沒有被覆蓋,則需要向他們補償,費用為wi。現在的問題是,選...

bzoj1835 線段樹優化dp)

神題啊,好吧,應該是因為我太弱了。設f i k 表示到第i個村莊,第i個村莊一定會建基站,已經建了k個基站的最小費用.f i k min c i 注意本題線段樹維護的是當我們列舉i的時候,線段樹來維護f j k 1 cost j i 就是之前的值和中間的值,整體維護dp方程中的東西。同時在列舉i增加...

BZOJ1003 ZJOI 物流運輸

物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...