Sol

设\(f[i][j]\)表示钦定\(i\)建基站,建了\(j\)个基站的最小代价

\(f[i][j]=max(f[l][j-1]+\Sigma_{t=l+1}^{i-1}\)不能影响到的村庄的\(w[t])+c[i]\)

二分处理出每个村庄\(p\)左右能影响到它的最远的基站设为\(L[p], R[p]\)

\(l,i\)不能影响到的即\(L[p]>l, R[p]<i\)

枚举\(j\),预处理出\(j=1\)的情况

线段树

每次把上次的\(f\)重建进入线段树,维护最小值

再枚举\(i\)每次加入\(R[p]\)小于\(i\)的覆盖\(1,L[p]\)

我是做到\(f[n+1]\),然后做\(k+1\)遍直接输出\(f[n+1]\)的

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 5); IL ll Input(){
RG ll x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int n, k, d[_], s[_], w[_], c[_], l[_], r[_], first[_], nxt[_];
int mn[_ << 2], tag[_ << 2], f[_]; IL void Build(RG int x, RG int l, RG int r){
tag[x] = 0;
if(l == r){
mn[x] = f[l];
return;
}
RG int mid = (l + r) >> 1;
Build(x << 1, l, mid), Build(x << 1 | 1, mid + 1, r);
mn[x] = min(mn[x << 1], mn[x << 1 | 1]);
} IL void Modify(RG int x, RG int l, RG int r, RG int L, RG int R, RG int v){
if(L <= l && R >= r){
mn[x] += v, tag[x] += v;
return;
}
RG int mid = (l + r) >> 1;
if(L <= mid) Modify(x << 1, l, mid, L, R, v);
if(R > mid) Modify(x << 1 | 1, mid + 1, r, L, R, v);
mn[x] = min(mn[x << 1], mn[x << 1 | 1]) + tag[x];
} IL int Query(RG int x, RG int l, RG int r, RG int L, RG int R){
if(R < L) return 0;
if(L <= l && R >= r) return mn[x];
RG int mid = (l + r) >> 1, ans = 2e9;
if(L <= mid) ans = Query(x << 1, l, mid, L, R);
if(R > mid) ans = min(ans, Query(x << 1 | 1, mid + 1, r, L, R));
return ans + tag[x];
} int main(RG int argc, RG char *argv[]){
Fill(first, -1), n = Input(), k = Input();
for(RG int i = 2; i <= n; ++i) d[i] = Input();
for(RG int i = 1; i <= n; ++i) c[i] = Input();
for(RG int i = 1; i <= n; ++i) s[i] = Input();
for(RG int i = 1; i <= n; ++i) w[i] = Input();
for(RG int i = 1; i <= n; ++i){
RG int L = 1, R = i;
while(L <= R){
RG int mid = (L + R) >> 1;
if(d[i] - d[mid] <= s[i]) R = mid - 1, l[i] = mid;
else L = mid + 1;
}
L = i, R = n;
while(L <= R){
RG int mid = (L + R) >> 1;
if(d[mid] - d[i] <= s[i]) L = mid + 1, r[i] = mid;
else R = mid - 1;
}
nxt[i] = first[r[i]], first[r[i]] = i;
}
for(RG int i = 1, g = 0; i <= n + 1; ++i){
f[i] = g + c[i];
for(RG int j = first[i]; j != -1; j = nxt[j]) g += w[j];
}
RG int ans = f[n + 1];
for(RG int p = 1; p <= k; ++p){
Build(1, 1, n);
for(RG int i = 1; i <= n + 1; ++i){
f[i] = Query(1, 1, n, 1, i - 1) + c[i];
for(RG int j = first[i]; j != -1; j = nxt[j])
if(l[j] > 1) Modify(1, 1, n, 1, l[j] - 1, w[j]);
}
ans = min(ans, f[n + 1]);
}
printf("%d\n", ans);
return 0;
}

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

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

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

  2. bzoj1835[ZJOI2010]基站选址

    主席树+决策单调,重写一遍比之前短多了……题解:http://www.cnblogs.com/liu-runda/p/6051422.html #include<cstdio> #incl ...

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

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

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

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

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

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

  6. 题解 [ZJOI2010]基站选址

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

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

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

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

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

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

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

随机推荐

  1. 海思3519A 移植 Qt 5.5.1

    源码下载 网址:qt-everywhere-opensource-src-5.5.1.tar.gz 配置生成MakeFile 文件 解压源码包,在源码包路径下生成配置 MakeFile : ./con ...

  2. CGLIB动态代理模式

    概念: 第三方技术CGLIB动态代理和JDK代理不同的是,JDK代理需要提供接口,而CGLIB代理不需要: 它只需要一个非抽象类就能实现动态代理 例子: /** * 非抽象类 * @author Ad ...

  3. JavaWeb后台从input表单获取文本值的两种方式

    JavaWeb后台从input表单获取文本值的两种方式 #### index.html <!DOCTYPE html> <html lang="en"> & ...

  4. JAVA中 this关键字的用法

    this 在类中就是代表当前对象,可以通过 this 关键字完成当前对象的成员属性.成员方法和构造方法的调用. 那么何时用 this? 当在定义类中的方法时,如果需要调用该类对象,就可以用 this来 ...

  5. Versions maven plugin 修改版本

    使用versions maven plugin插件,批量修改项目各模块的版本号,灵活推进或回退版本,避免主干每次更新代码,立即对所有分支产生影响. https://blog.csdn.net/sunz ...

  6. 文献综述十七:基于 sql环境下超市管理系统的设计与实现

    一.基本信息 标题:基于 sql环境下超市管理系统的设计与实现 时间:2018 出版源:智能计算机与应用 文件分类:uml技术的研究 二.研究背景 从超市管理系统的实际应用出发,在系统分析过程中,从功 ...

  7. python+selenium打开浏览器报错问题

    报关键字,升级selenium版本 若打开IE浏览器,停在IE界面,无法跳转对应的地址,设置一下IE的页面缩放,设置为100%

  8. 2019年UX设计新趋势

    UX设计总是在不断变化中.最近短短两年的时间里,我们已经看到,很多地方都大规模采用颠覆性技术,比如语音用户界面,混合现实和智能家居设备.设计这些体验的实际过程可能保持不变,但新技术的出现引发了新的行为 ...

  9. C# 直接创建一个DataTable,并为之添加数据(自定义DataTable) 转

    DataTable dt=new DataTable("cart"); DataColumn dc1=new DataColumn("prizename",Ty ...

  10. Ubuntu14.04下完美安装cloudermanage多种方式(图文详解)(博主推荐)

    说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1.ubuntucmbigdata2.ubuntucmbigdata3和ubuntucmbigdata4. ClouderaMan ...