BZOJ 1835 基站选址(线段树优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835
题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离为Di。需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci。如果在距离第i个村 庄不超过Si的范围内建立了一个通讯基站,那么就成它被覆盖了。如果第i个村庄没有被覆盖,则需要向他们补偿,费用为Wi。现在的问题是,选择基站的位 置,使得总费用最小。
思路:
另外,程序中的n=n+1,m=m+1。因
为每次使用f[n]更新答案的,而f[n]的含义是在n位置建立一个通讯站,但是显然有时候最优值并不是一定要在n建立一个。将n+1之后,m+1,则
m+1个必然建立在n+1,而这一个在我们计算st和ed数组时看出他们是不对前面的有影响的。因此统计f[n+1]才是正确的。
struct Node
{
int L,R;
i64 Min,det;
void set(i64 x)
{
det+=x;
Min+=x;
}
};
Node a[N<<2];
void pushUp(int t)
{
if(a[t].L==a[t].R) return;
a[t].Min=min(a[t*2].Min,a[t*2+1].Min);
}
i64 f[N],ans;
void build(int t,int L,int R)
{
a[t].L=L;
a[t].R=R;
a[t].det=0;
if(L==R)
{
a[t].Min=f[L];
return;
}
int mid=(L+R)>>1;
build(t*2,L,mid);
build(t*2+1,mid+1,R);
pushUp(t);
}
void pushDown(int t)
{
if(a[t].L==a[t].R) return;
if(a[t].det)
{
a[t*2].set(a[t].det);
a[t*2+1].set(a[t].det);
a[t].det=0;
}
}
void add(int t,int L,int R,i64 x)
{
if(L>a[t].R||R<a[t].L) return;
if(L<=a[t].L&&a[t].R<=R)
{
a[t].set(x);
return;
}
pushDown(t);
add(t*2,L,R,x);
add(t*2+1,L,R,x);
pushUp(t);
}
i64 query(int t,int L,int R)
{
if(L>a[t].R||R<a[t].L) return inf;
if(L<=a[t].L&&a[t].R<=R) return a[t].Min;
pushDown(t);
i64 ans=min(query(t*2,L,R),query(t*2+1,L,R));
pushUp(t);
return ans;
}
int n,m,d[N],c[N],s[N],w[N];
int st[N],ed[N];
vector<int> V[N];
int getL(int x,int pos)
{
int low=1,high=pos,mid;
while(low<=high)
{
mid=(low+high)>>1;
if(d[mid]>=x) high=mid-1;
else low=mid+1;
}
if(high>=1&&d[high]>=x) return high;
return low;
}
int getR(int x,int pos)
{
int low=pos,high=n,mid;
while(low<=high)
{
mid=(low+high)>>1;
if(d[mid]>x) high=mid-1;
else low=mid+1;
}
if(low<=n&&d[low]<=x) return low;
return high;
}
void init()
{
int i;
FOR1(i,n)
{
st[i]=getL(d[i]-s[i],i);
ed[i]=getR(d[i]+s[i],i);
V[ed[i]].pb(i);
}
}
void DP()
{
build(1,0,n);
int i,j,k;
FOR1(i,n)
{
f[i]=query(1,0,i-1)+c[i];
FOR0(j,SZ(V[i]))
{
k=V[i][j];
add(1,0,st[k]-1,w[k]);
}
}
upMin(ans,f[n]);
}
int main()
{
RD(n,m);
int i;
for(i=2;i<=n;i++) RD(d[i]);
FOR1(i,n) RD(c[i]);
FOR1(i,n) RD(s[i]);
FOR1(i,n) RD(w[i]);
FOR1(i,n) f[i]=inf;
init();
ans=inf; n++; m++;
FOR1(i,m) DP();
PR(ans);
}
BZOJ 1835 基站选址(线段树优化DP)的更多相关文章
- 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$
正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...
- BZOJ 1835 [ZJOI2010]基站选址 (线段树优化DP)
题目大意:略 洛谷题面传送门 BZOJ题面传送门 注意题目的描述,是村庄在一个范围内去覆盖基站,而不是基站覆盖村庄,别理解错了 定义$f[i][k]$表示只考虑前i个村庄,一共建了$k$个基站,最后一 ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- luogu P2605 [ZJOI2010]基站选址 线段树优化dp
LINK:基站选址 md气死我了l达成1结果一直调 显然一个点只建立一个基站 然后可以从左到右进行dp. \(f_{i,j}\)表示强制在i处建立第j个基站的最小值. 暴力枚举转移 复杂度\(n\cd ...
- luogu2605 基站选址 (线段树优化dp)
设f[i][j]表示在第i个村庄建第j个基站的花费 那么有$f[i][j]=min\{f[k][j-1]+w[k,i]\}$,其中w[k,i]表示在k,i建基站,k,i中间的不能被满足的村庄的赔偿金之 ...
- BZOJ1835: [ZJOI2010]base 基站选址(线段树优化Dp)
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- Codeforces Round #426 (Div. 2) D 线段树优化dp
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
- [AGC011F] Train Service Planning [线段树优化dp+思维]
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...
- 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...
随机推荐
- oracle的表空间
创建表空间 1:创建单个文件的表空间 CREATE TABLESPACE SAMPLE LOGGING DATAFILE 'D:\11.dbf' SIZE 5M REUSE EXTENT MANAGE ...
- 【crunch bang】 增加“菜单项”
[右键菜单]->[Settings]->[Openbox]->[GUI Menu Editor] 挑选合适的位置,增加[菜单项],编辑内容.
- Workspace Cloning / Sharing in Jenkins
http://lwandersonmusings.blogspot.com/2011/06/workspace-cloning-sharing-in-hudson.html What's insi ...
- .container_fluid 与 .container 的区别
.container 会在左右两侧留白边,而且是自动的,不用设置. .container{ padding-right:15px; padding-left:15px; margin-right:au ...
- iOS 学习笔记 一 (2015.02.05)
一:Xcode6输入框设置为 keyboard type设置为Number Pad弹不出键盘的解决办法 问题:Can't find keyplane that supports type 4 fo ...
- Linux设备驱动之semaphore机制【转】
转自:http://blog.csdn.net/xiao229404041/article/details/7031776 Linux设备驱动之semaphore机制在Linux系统中,信号号是一种重 ...
- 关于Win7 64位 mysql 5.7下载安装问题
1.从官网下载mysql: 网址:http://dev.mysql.com/downloads/mysql/ 这是我们要找的,win7 64位 点击下载: 出现如图所示,我们不必要登录注册,点击红线内 ...
- 5、XML(1)
1 XML入门 1.1 引入 HTML: 负责网页的结构 CSS: 负责网页的样式(美观) Javascript: 负责在浏览器端与用户进行交互. 负责静态的网页制作的语言 HTML语言特点: 1)由 ...
- ACM题目————又见拦截导弹
描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮 ...
- ACM题目————装箱问题
题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩 ...