最近状态太差,先补补结题报告吧
这是一道好题
设f[i,j]表示到第j个位置建了i个基站且第j个位置建了基站的最小花费
不难得到f[i,j]=min(f[i-1,k]+cost[k+1,j])+c[j];
首先为了方便计算假定在两端无穷远处还要建一个基站(方便统计)
i我们是可以滚动的不管他,问题就是如何解决cost
也就是两个基站间的村庄的补偿费
我们设每个村庄i向左最远能收到l[i]位置上基站的信号,向右最远r[i]
不难发现,随着j的递增,cost[k]是呈上升趋势的
也就是,对于当前j,那些r[p]<j的点p,向右是永远收不到信号了,
向左对于在位置k∈[0,l[p]-1]的基站,随着j增加以k,j为端点建基站对于p是永远要收补偿费的
于是我们令cost[k]表示(k建基站)到当前点之间村庄要收补偿费的和
对于当前点j,我们找出r[p]+1=j的点p,对于k∈[0,l[p]-1] cost[k]+w[p]
显然是区间查询,区间修改的问题,我们可以用线段树解决
复杂度O(knlogn)

 type node=record
po,next:longint;
end; var f,c,d,p,w,s,l:array[..] of longint;
e:array[..] of node;
tree,lazy:array[..*] of longint;
ans,n,m,i,j,k,t,x:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure update(i:longint);
begin
tree[i]:=min(tree[i*],tree[i*+]);
end; procedure push(i:longint);
begin
inc(lazy[i*],lazy[i]);
inc(lazy[i*+],lazy[i]);
inc(tree[i*],lazy[i]);
inc(tree[i*+],lazy[i]);
lazy[i]:=;
end; function fl(l,r,x:longint):longint;
var m:longint;
begin
fl:=r;
while l<=r do
begin
m:=(l+r) shr ;
if d[m]>=x then
begin
fl:=m;
r:=m-;
end
else l:=m+;
end;
end; function fr(l,r,x:longint):longint;
var m:longint;
begin
fr:=l;
while l<=r do
begin
m:=(l+r) shr ;
if d[m]<=x then
begin
fr:=m;
l:=m+;
end
else r:=m-;
end;
end; procedure build(i,l,r:longint);
var m:longint;
begin
lazy[i]:=;
if l=r then
begin
tree[i]:=f[l];
lazy[i]:=;
end
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
update(i);
end;
end; procedure work(i,l,r,x,y:longint);
var m:longint;
begin
if r<=x then
begin
inc(lazy[i],y);
inc(tree[i],y);
end
else begin
if lazy[i]<> then push(i);
m:=(l+r) shr ;
work(i*,l,m,x,y);
if x>m then work(i*+,m+,r,x,y);
update(i);
end;
end; function ask(i,l,r,x:longint):longint;
var m,s:longint;
begin
if r<=x then exit(tree[i])
else begin
if lazy[i]<> then push(i);
m:=(l+r) shr ;
s:=ask(i*,l,m,x);
if x>m then s:=min(s,ask(i*+,m+,r,x));
exit(s);
end;
end; begin
readln(n,m);
for i:= to n do
read(d[i]);
for i:= to n do
read(c[i]);
for i:= to n do
read(s[i]);
for i:= to n do
begin
read(w[i]);
ans:=ans+w[i];
end;
for i:= to n do
begin
l[i]:=fl(,i,d[i]-s[i]);
x:=fr(i,n,d[i]+s[i]);
inc(t);
e[t].po:=i;
e[t].next:=p[x+];
p[x+]:=t;
end;
for i:= to m do
begin
build(,,n);
for j:= to n+ do
begin
k:=p[j];
while k<> do
begin
work(,,n,l[e[k].po]-,w[e[k].po]);
k:=e[k].next;
end;
if i= then x:= else x:=j-;
f[j]:=ask(,,n,x)+c[j];
end;
ans:=min(ans,f[n+]);
end;
build(,,n);
for j:= to n+ do
begin
k:=p[j];
while k<> do
begin
work(,,n,l[e[k].po]-,w[e[k].po]);
k:=e[k].next;
end;
end;
ans:=min(ans,ask(,,n,n));
writeln(ans);
end.

bzoj1835的更多相关文章

  1. 【BZOJ1835】基站选址(线段树)

    [BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f ...

  2. 【BZOJ1835】[ZJOI2010]base 基站选址 线段树+DP

    [BZOJ1835][ZJOI2010]base 基站选址 Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯 ...

  3. bzoj1835[ZJOI2010]base基站选址

    据说正解是什么线段树优化DP,但是作为脑子有坑选手,我们需要5k的做法: 主席树+决策单调性..... F[m][i]表示已经放置了m个基站,第m个基站放置在第i个村庄,第i个村庄及之前的村庄的总最少 ...

  4. 【BZOJ1835】【ZJOI2010】基站选址

    原题传送门 Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距 ...

  5. BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】

    题目分析: 首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价. 仔细思考两个基站之间村庄的 ...

  6. 2018.11.06 bzoj1835: [ZJOI2010]base 基站选址(线段树优化dp)

    传送门 二分出每个点不需要付www贡献的范围,然后可以推出转移式子: f[i][j]=f[i−1][k]+value(k+1,j)+c[i]f[i][j]=f[i-1][k]+value(k+1,j) ...

  7. BZOJ1835,LG2605 [ZJOI2010]基站选址

    题意 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为\(D_i\) 需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为\(C_i\) 如果在距离第i个村 ...

  8. BZOJ1835: [ZJOI2010]base 基站选址【线段树优化DP】

    Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...

  9. Bzoj1835:[ZJOI2010]基站选址

    Sol 设\(f[i][j]\)表示钦定\(i\)建基站,建了\(j\)个基站的最小代价 \(f[i][j]=max(f[l][j-1]+\Sigma_{t=l+1}^{i-1}\)不能影响到的村庄的 ...

随机推荐

  1. Spring中整合Titles

    在<Spriing实战(第三版)>这本书中,有一个使用titles的例子,但是这是一个不完整的例子.那么要参照起来就比较难了,于是找到了下面这篇博客. 在Spring中使用tiles2 ( ...

  2. DDX_Text (MFC)

    DDX_Text (MFC) 描述:该DDX_Text功能管理int的转移,UINT,long,DWORD,CString,float, 或 double编辑控件之间的数据在对话框中,表单视图或控制视 ...

  3. 04_过滤器Filter_01_入门简述

    [简述] Filter也称之为过滤器.通过Filter技术,对web服务器管理的所有资源(如:Jsp.Servlet.静态图片文件.静态HTML文件等)进行拦截,从而实现一些特殊的功能.例如实现URL ...

  4. C++多态性的理解

    本文章转载来自:http://www.sollyu.com/?p=627 代码 #include <iostream.h> class Animal { public: void eat( ...

  5. ubuntu zendDebugger.so 加载不上的问题

    参考文章   http://blog.sina.com.cn/s/blog_6612d5810101dapf.html 装zenDdebugger是为了在eclipse中调试用!!!!!!!结果搞了半 ...

  6. Yii Swiftmailer 发送中文附件

    所用的是Yii2 的basic框架.它本身集成了邮件发送插件swiftmailer,发送邮件是很方便的,但是当发送的邮件带有中文名称的附件时,就出现了问题,邮件所带的附件显示名称错误.比如原名&quo ...

  7. MySQL中EXPLAIN解释命令详解

    MySQL中的explain命令显示了mysql如何使用索引来处理select语句以及连接表.explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句. 1.EXPLAIN的使用方法:在s ...

  8. node 无解回调 有解了

    http://cssor.com/javascript-workflow-by-tofishes.html

  9. python【第十九篇】Django进阶

    1.路由系统优化 1.1 路由分发 前面我们已经知道,在工程名下的urls.py中写我们的路由映射关系,那么问题来了,假设我们有10个app,如果把所有的url映射都写在urls.py文件中,那么每一 ...

  10. 【C语言】37个关键字

    C语言37个关键字 一.相关基础知识 年. 关键字:是由系统定义的,不能重新做其他定义的字符,且每个关键字已经赋予了不同的意义,让编程者能够使用来告诉编译器完成不同的工作PS:C语言严格区分大小写,i ...