P2605 ZJOI2010 基站選址

2021-09-08 13:24:20 字數 4060 閱讀 3256

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

輸入格式:

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

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

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

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

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

輸出格式:

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

輸入樣例#1:

3 2

1 22 3 2

1 1 0

10 20 30

輸出樣例#1:

4
40%的資料中,n<=500;

100%的資料中,k<=n,k<=100,n<=20,000,di<=1000000000,ci<=10000,si<=1000000000,wi<=10000。

但是不知道為什麼怎麼調都不對,。。。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

#define inf 0x7ffff

9#define ls k<<1

10#define rs k<<1|1

11using

namespace

std;

12const

int maxn=4e4+5

;13 inline void read(int &n)

1417

while(c>='

0'&&c<='

9')n=n*10+c-48,c=getchar();18}

19struct

node

20edge[maxn];

23int

head[maxn];

24int num=1

;25 inline void add_edge(int x,int

y)26

32structt33

tree[maxn];

36int

n,k;

37int

d[maxn];

38int

c[maxn];

39int

s[maxn];

40int

w[maxn];

41int

st[maxn];

42int

ed[maxn];

43int dp[maxn];//

修建了i個基站的費用

44int

ans;

45 inline void update(int

k)46

49 inline void pushdown(int

k)50

58 inline void build_tree(int k,int ll,int

rr)59

67int mid=(ll+rr)>>1

;68 build_tree(ls,ll,mid);build_tree(rs,mid+1

,rr);

69update(k);70}

71 inline int query(int k,int ql,int

qr)72

82 inline void change(int k,int ql,int qr,int

val)

83

88pushdown(k);

89int mid=(tree[k].l+tree[k].r)>>1;90

if(qr<=mid) change(ls,ql,qr,val);

91else

if(ql>mid) change(rs,ql,qr,val);

92else

9397

update(k);98}

99int

main()

100117

118for(int i=1;i<=k;i++)

119132

133}

134 ans=dp[n];

135}

136else

137149 ans=min(ans,dp[n]);

150}

151}

152 printf("%d"

,ans);

153return0;

154 }

uke

本**來自:

1 #include 2 #include 3 #include 4 #include 5

#define sl (s << 1)

6#define sr (s << 1 | 1)78

using

namespace

std;

9const

int maxn = 0x3f3f3f3f;10

const

int n = 2e4 + 5, m = n << 2;11

intd[n], c[n], w[n], s[n], st[n], ed[n], f[n];

12int

n, k, ans, val[m], tag[m];

1314

struct

point

15a[m], *t = a, *lst[n];

1819 inline void addedge(const

int &x, const

int &y)

20 template inline t min(const t &a, const t &b)

21 template inline void ckmin(t &a, const t &b)

2223 inline int

get()

2433

34 inline void put(int

x)35

4142 inline void push(const

int &s)

43 inline void add(const

int &s, const

int &z)

44 45

46 inline void down(const

int &s)

4751

52 inline void build(const

int &s, const

int &l, const

int &r)

5360

61 inline int query(const

int &s, const

int &l, const

int &r, const

int &x, const

int &y)

6270

71 inline void modify(const

int &s, const

int &l, const

int &r, const

int &x, const

int &y, const

int &z)

7282

push(s);83}

8485

intmain()

86107

for (int i = 1; i <= k; ++i)

108if (i == 1

)109

117 ans =f[n];

118}

119else

120131

ckmin(ans, f[n]);

132}

133return put(ans), 0

;134 }

P2605 ZJOI2010 基站選址

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

ZJOI2010 基站選址

洛谷題目鏈結 真毒瘤 這個題目耗了我半天。結果是線段樹打錯了。回歸正題 線段樹 dp 首先當然是先考慮樸素 dp 啦,相信你既然都來做這題了,樸素的方程自然不用我多說,設 f i j 表示在前 i 個村莊內,第 j 個基站建在 i 處的最小費用 不考慮 i n 的賠償費用等 方程為 f i j mi...

bzoj 1835 ZJOI2010 基站選址

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