题目描述

有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 2
2 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。

转自Navi_Awson

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct Node
{
int next,to;
} edge[];
int head[],num;
lol Min[],f[];
lol lazy[];
int n,k,d[],c[],l[],w[];
int st[],ed[],inf=1e15;
lol ans,now;
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
void build(int rt,int l,int r)
{
lazy[rt]=;
if (l==r)
{
Min[rt]=f[l];
return;
}
int mid=(l+r)/;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
Min[rt]=min(Min[rt<<],Min[rt<<|]);
}
void pushdown(int rt)
{
if (lazy[rt])
{
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
Min[rt<<]+=lazy[rt];
Min[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void update(int rt,int l,int r,int L,int R,lol d)
{
if (l>=L&&r<=R)
{
Min[rt]+=d;
lazy[rt]+=d;
return;
}
int mid=(l+r)/;
pushdown(rt);
if (L<=mid) update(rt<<,l,mid,L,R,d);
if (R>mid) update(rt<<|,mid+,r,L,R,d);
Min[rt]=min(Min[rt<<],Min[rt<<|]);
}
lol query(int rt,int l,int r,int L,int R)
{
if (l>=L&&r<=R)
{
return Min[rt];
}
int mid=(l+r)/;
lol s=2e15;
pushdown(rt);
if (L<=mid) s=min(s,query(rt<<,l,mid,L,R));
if (R>mid) s=min(s,query(rt<<|,mid+,r,L,R));
Min[rt]=min(Min[rt<<],Min[rt<<|]);
return s;
}
int main()
{
int i,j,p;
cin>>n>>k;
for (i=; i<=n; i++)
scanf("%d",&d[i]);
for (i=; i<=n; i++)
scanf("%d",&c[i]);
for (i=; i<=n; i++)
scanf("%d",&l[i]);
for (i=; i<=n; i++)
scanf("%d",&w[i]);
++n;
++k;
w[n]=inf;
d[n]=inf;
for (i=; i<=n; i++)
{
st[i]=lower_bound(d+,d+n+,d[i]-l[i])-d;
ed[i]=lower_bound(d+,d+n+,d[i]+l[i])-d;
if (d[ed[i]]>d[i]+l[i]) ed[i]--;
add(ed[i],i);
}
ans=2e15;
for (i=; i<=n; i++)
{
f[i]=now+c[i];
for (j=head[i]; j; j=edge[j].next)
{
int v=edge[j].to;
now+=w[v];
}
}
ans=min(ans,f[n]);
for (i=; i<=k; i++)
{
build(,,n);
for (j=; j<=n; j++)
{
if (j>)
f[j]=query(,,n,,j-)+c[j];
else f[j]=c[j];
for (p=head[j]; p; p=edge[p].next)
{
int v=edge[p].to;
if (st[v]>) update(,,n,,st[v]-,w[v]);
}
}
ans=min(ans,f[n]);
}
cout<<ans;
}

[ZJOI2010]基站选址的更多相关文章

  1. 【题解】Luogu P2605 [ZJOI2010]基站选址

    原题传送门:P2604 [ZJOI2010]基站选址 看一眼题目,变知道这题一定是dp 设f[i][j]表示在第i个村庄修建第j个基站且不考虑i+1~n个村庄的最小费用 可以得出f[i][j] = M ...

  2. 【LG2605】[ZJOI2010]基站选址

    [LG2605][ZJOI2010]基站选址 题面 洛谷 题解 先考虑一下暴力怎么写,设\(f_{i,j}\)表示当前\(dp\)到\(i\),且强制选\(i\),目前共放置\(j\)个的方案数. 那 ...

  3. 题解 [ZJOI2010]基站选址

    题解 [ZJOI2010]基站选址 题面 解析 首先考虑一个暴力的DP, 设\(f[i][k]\)表示第\(k\)个基站设在第\(i\)个村庄,且不考虑后面的村庄的最小费用. 那么有\(f[i][k] ...

  4. luogu P2605 [ZJOI2010]基站选址 线段树优化dp

    LINK:基站选址 md气死我了l达成1结果一直调 显然一个点只建立一个基站 然后可以从左到右进行dp. \(f_{i,j}\)表示强制在i处建立第j个基站的最小值. 暴力枚举转移 复杂度\(n\cd ...

  5. [ZJOI2010]基站选址,线段树优化DP

    G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...

  6. bzoj 1835: [ZJOI2010]基站选址

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

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

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

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

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

  9. P2605 [ZJOI2010]基站选址

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

随机推荐

  1. X-pack安装

    1. Install X-Pack into Elasticsearch   docker exec -it anyrobot-store /bin/bash   bin/elasticsearch- ...

  2. 20155214&20155216 实验一 开发化境的熟悉

    20155214&20155216 实验一 开发化境的熟悉 实验内容: 实验一 开发化境的熟悉-1-交叉编译环境-(使用实验室台式机) 1.建立实验目录"mkdir linux_组员 ...

  3. backpropagation

    github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...

  4. 201621123057 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 答 ...

  5. POST请求的提交

    var http = require("http"); var querystring = require("querystring"); //创建服务器 va ...

  6. AWS中,如果使用了ELB,出现outofservice

    平台:亚马逊AWS EC2 出现状况: 我创建了弹性平衡负载,也注册了实例,但是实例的状态一直是outofservice.为什么? 为什么会出现这个问题呢? 1:实例有问题: 2:负载平衡器创建的有问 ...

  7. 面试必问---HashMap原理分析

    一.HashMap的原理 众所周知,HashMap是用来存储Key-Value键值对的一种集合,这个键值对也叫做Entry,而每个Entry都是存储在数组当中,因此这个数组就是HashMap的主干.H ...

  8. 常用的 html 标签及注意事项

    <a> 标签 用法:用于定义超链接 清除浏览器默认样式: a { text-decoration: none;/* 去除下划线 */ color: #333;/* 改变链接颜色 */ } ...

  9. 使用ArrayList时代码内部发生了什么(jdk1.7)?

    前言 ArrayList(这里的ArrayList是基于jdk1.7)是在项目中经常使用的集合类,例如我们从数据库中查询出一组数据.这篇文章不去剖析它的继承和实现,只是让我们知道实例化及增删改查时它的 ...

  10. Css之导航栏学习

    Css: ul { list-style-type:none; margin:; padding:; overflow:hidden; background-color:blue; /*固定在顶部*/ ...