BZOJ 1835: [ZJOI2010]base 基站选址(DP,线段树)
可以很容易的写出dp方程:
F[i][j]=min(F[l][j-1]+w[l][i])+c[i] (w[i][j]是从l+1到i-1这些点p里,所有满足d[p]+s[p]<d[i] && d[p]-s[p]>d[l]的点的w[p]之和)
考虑i+1,会对方程造成什么变化
w[l][i]会变得跟大了(满足d[p]+s[p]<d[i]的点更多了)
可以发现增长的是一个区间,求和也是一个区间
线段树解决
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 20100
#define inf 1000000000
struct node {
int l,r,mi,lz;
}t[maxn*8];
#define lc(x) (x<<1)
#define rc(x) ((x<<1)+1)
#define mi(x) t[x].mi
#define lz(x) t[x].lz
#define mid ((l+r)>>1)
#define update(x) mi(x)=min(mi(lc(x)),mi(rc(x)))
int f[maxn],pf[maxn];
int build(int x,int l,int r) {
t[x].l=l,t[x].r=r;
t[x].lz=0;
if (l==r) return t[x].mi=pf[l];
build(lc(x),l,mid);
build(rc(x),mid+1,r);
update(x);
return 0;
}
int pushback(int x) {
if (t[x].l==t[x].r) return 0;
lz(lc(x))+=lz(x),lz(rc(x))+=lz(x);
mi(lc(x))+=lz(x),mi(rc(x))+=lz(x);
lz(x)=0;
}
int query(int x,int x1,int y1){
int l=t[x].l,r=t[x].r;
if (y1<l||x1>r) return inf;
if (x1<=l&&y1<=r) return mi(x);
pushback(x);
return min(query(lc(x),x1,y1),query(rc(x),x1,y1));
}
int add(int x,int x1,int y1,int z) {
int l=t[x].l,r=t[x].r;
if (y1<l||x1>r) return 0;
if (x1<=l&&y1>=r) return lz(x)+=z,mi(x)+=z;
pushback(x);
add(lc(x),x1,y1,z),add(rc(x),x1,y1,z);
update(x);
}
int n,k;
int c[maxn],s[maxn],d[maxn],w[maxn];
int st[maxn],ed[maxn];
vector<int> list[maxn];
int solve(){
int sum=0;
for (int i=1;i<=n;i++) {
f[i]=sum+c[i];
for(int j=0;j<list[i].size();j++) sum+=w[list[i][j]];
}
int ans=f[n];
for (int i=1;i<=k;i++) {
//for (int i=1;i<=n;i++) printf("%d ",f[i]);printf("\n");
memcpy(pf,f,sizeof(pf));
for (int j=1;j<=n;j++) f[j]=inf;
build(1,1,n);
for (int j=1;j<=n;j++){
f[j]=min(f[j],query(1,1,j-1))+c[j];
for (int k=0;k<list[j].size();k++) add(1,1,st[list[j][k]]-1,w[list[j][k]]);
}
ans=min(ans,f[n]);
}
printf("%d\n",ans);
return 0;
}
int main(){
scanf("%d%d",&n,&k);
for (int i=2;i<=n;i++) scanf("%d",d+i);
for (int i=1;i<=n;i++) scanf("%d",c+i);
for (int i=1;i<=n;i++) scanf("%d",s+i);
for (int i=1;i<=n;i++) scanf("%d",w+i);
d[++n]=inf,c[n]=w[n]=s[n]=0;
for (int i=1;i<=n;i++) {
st[i]=lower_bound(d+1,d+1+n,d[i]-s[i])-d;
ed[i]=upper_bound(d+1,d+1+n,d[i]+s[i])-d-1;
list[ed[i]].push_back(i);
}
solve();
return 0;
}
BZOJ 1835: [ZJOI2010]base 基站选址(DP,线段树)的更多相关文章
- BZOJ 1835 [ZJOI2010]base 基站选址:线段树优化dp
传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基 ...
- BZOJ 1835: [ZJOI2010]base 基站选址 [序列DP 线段树]
1835: [ZJOI2010]base 基站选址 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立 ...
- bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...
- BZOJ1835: [ZJOI2010]base 基站选址【线段树优化DP】
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- 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) ...
- bzoj 1835: [ZJOI2010]base 基站选址
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- bzoj[1835][ZJOI2010]base 基地选址
bzoj[1835][ZJOI2010]base 基地选址 标签: 线段树 DP 题目链接 题解 这个暴力DP的话应该很容易看出来. dp[i][j]表示造了i个通讯站,并且j是第i个的最小费用. \ ...
- bzoj 1835 base 基站选址 - 动态规划 - 线段树
题目传送门 需要高级权限的传送门 题目大意 有$n$个村庄坐落在一条直线上,第$i \ \ \ (i>1)$个村庄距离第$1$个村庄的距离为$D_i$.需要在这些村庄中建立不超过$K$个通讯基站 ...
- BZOJ 1835 基站选址(DP+线段树)
# include <cstdio> # include <cstring> # include <cstdlib> # include <iostream& ...
随机推荐
- 【View层】界面绘制
[引用]:http://www.jianshu.com/p/c5fc8c6b967a [View层]IOS纯代码绘制界面(一) 字数2303 阅读385 评论2 喜欢16 IOS开发中界面绘制占据了绝 ...
- 安卓组件service
[转]http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Acti ...
- SQLite高级:一库建多表,封装类
package eoe.database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; ...
- Linux之目录基本操作命令
Linux之目录基本操作命令 目录基本操作命令 1.tree命令 tree命令以树状图列出目录的内容. 语法 tree(选项)(参数) 选项 1.-a显示所有文件和目录 2.-A使用ASNI绘图字符显 ...
- fastreport.net cdoe 自己的代码
//初始 Report report1 = new Report(); report1.Clear(); string Re ...
- JavaScript实用功能代码片段
把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 1.原生JavaScript实现字符串长度截取 function cutst ...
- Angular - - $http请求服务
$http $http是Angular的一个核心服务,它有利于浏览器通过XMLHttpRequest 对象或者 JSONP和远程HTTP服务器交互. $HTTP API 是基于 $q服务暴露的defe ...
- ThinkPHP 3 MVC模式和URL访问
一.什么是MVC //了解 M -Model 编写model类 对数据进行操作 V -View 编写html文件,页面呈现 C -Controlle ...
- IOS开发缓存机制之—本地缓存机制
功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这 ...
- JavaScript成员属性读取
var obj = {}; 检索一个不存在的成员属性的值,将返回undefined; 可以使用||运算符来填充默认值: var status = obj.status||'inistatus' 从un ...