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. php sapi 产生core 文件

    php sapi 产生core 文件 1) vim /usr/local/php7.1.6-debug/etc/php-fpm.conf rlimit_core = 0 改为 rlimit_core ...

  2. 运算符重载入门demo

    #include "pch.h" #include <iostream> using namespace std; class A { public: A(int x, ...

  3. 大数据-hadoop HA集群搭建

    一.安装hadoop.HA及配置journalnode 实现namenode HA 实现resourcemanager HA namenode节点之间通过journalnode同步元数据 首先下载需要 ...

  4. 常见浏览器hack汇总

    1.背景渐变bug: ①.ie8 ie9:用滤镜的方式解决: -ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientT ...

  5. python之类与对象(5)

    6. 类的多继承与超继承 6.1 多继承 python的类还有一个特点,就是可以继承多个类.但是我们作为测试人员,在实际中很少用到这个多继承,这里不就详细(一直都不详细,hhhh)写了.上代码: #! ...

  6. MqttNet 通讯

    MQTT,IBM发明的物联网通讯协议基于tcp ip , 收集传感器上的数据. 下图理解:  broker 这里有很多消息,根据主题不同来进行区分,它这里可以保管所有连过来的客户端的数据,然后客户端, ...

  7. 分分钟钟学会Python -基础&运算符

    day002 基础&运算符 1.循环语句 ### 1.循环格式 while 条件: print('') ''' while True: print('人生苦短,我用Python.') ''' ...

  8. Duilib总体框架

    从GoogleCode上下载的duilib工程中附带的一副总体设计图(如下所示),可以先整体了解一下,有个初步的认识,对后续进一步深入了解学习会很有帮助. 通过设计图有了一个初步认识后,接下来开始进一 ...

  9. 转:五年java人的一点感悟

    转自:五年java人的一点感悟 恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自 己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了 ...

  10. IO概念解析------同步异步阻塞非阻塞

    各个IO Model的比较如图所示: 阻塞和非阻塞强调的是程序在等待调用结果(消息,返回值)时的状态.  阻塞调用是指调用结果返回之前,当前线程会被挂起.调用线程只有在得到结果之后才会返回.非阻塞调用 ...