可以很容易的写出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,线段树)的更多相关文章

  1. BZOJ 1835 [ZJOI2010]base 基站选址:线段树优化dp

    传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基 ...

  2. BZOJ 1835: [ZJOI2010]base 基站选址 [序列DP 线段树]

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

  3. bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...

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

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

  5. 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) ...

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

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

  7. bzoj[1835][ZJOI2010]base 基地选址

    bzoj[1835][ZJOI2010]base 基地选址 标签: 线段树 DP 题目链接 题解 这个暴力DP的话应该很容易看出来. dp[i][j]表示造了i个通讯站,并且j是第i个的最小费用. \ ...

  8. bzoj 1835 base 基站选址 - 动态规划 - 线段树

    题目传送门 需要高级权限的传送门 题目大意 有$n$个村庄坐落在一条直线上,第$i \ \ \ (i>1)$个村庄距离第$1$个村庄的距离为$D_i$.需要在这些村庄中建立不超过$K$个通讯基站 ...

  9. BZOJ 1835 基站选址(DP+线段树)

    # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream& ...

随机推荐

  1. sqlserver 脚本方式导出数据到excel

    use EntDataCenter go SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- =========================== ...

  2. selenium IE 浏览器驱动下载地方

    download: http://selenium-release.storage.googleapis.com/index.html

  3. iOS数据存储

    [reference]http://www.infoq.com/cn/articles/data-storage-in-ios 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就 ...

  4. Centos7.2 编译安装PHP7

    PHP7,编译安装: 环境:centos7.2    (注意:因为我用的nginx, 此配置参数没有考虑到apache,所以不合适需要用apache的朋友照搬过去运行,但是可以参考.)   直接下载P ...

  5. 【Xilinx-Petalinux学习】-01-开发环境搭建与PetaLinux的安装

    开发环境 VMware12, Ubuntu 16.04 64 bit 在VMware中安装Ubuntu,用户名:xilinx-arm 密码:root step1: VMware Tools问题 不知道 ...

  6. Maven deploy时报Fatal error compiling: tools.jar not found错误的问题处理

    摘自:http://blog.csdn.net/achilles12345/article/details/19046061 在Eclipse环境下,使用Maven进行deploy时发现报了该错误:F ...

  7. ArcGIS Server的切图原理深入(转载)

    http://forum.osgearth.org/template/NamlServlet.jtp?macro=search_page&node=2174485&query=arcg ...

  8. Grunt之watch详解

    Grunt 之 watch 和 livereload 现在 watch 中已经集成了 livereload ,所以把它们放在一起说明. watch 可以监控特定的文件,在添加文件.修改文件.或者删除文 ...

  9. CSS3动画效果——js调用css动画属性并回调处理详解

    http://www.jb51.net/css/258407.html 这篇文章主要详细介绍了CSS3动画效果回调处理,需要的朋友可以参考下 我们在做js动画的时候,很多时候都需要做回调处理,如在一个 ...

  10. 1.4.2.3. SETUP(Core Data 应用程序实践指南)

    初始化Core Data的三个方法: init,初始化托管对象模型.持久化存储协调器.托管对象上下文 - (id)init { ) { NSLog(@"Running %@ '%@'&quo ...