有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:1 22 3 2
1 1 0
10 20 30
440%的資料中,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 #include8uke#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 }
本**來自: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。現在的問題是,選...