Bzoj1835:[ZJOI2010]基站选址
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]基站选址的更多相关文章
- BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】
题目分析: 首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价. 仔细思考两个基站之间村庄的 ...
- bzoj1835[ZJOI2010]基站选址
主席树+决策单调,重写一遍比之前短多了……题解:http://www.cnblogs.com/liu-runda/p/6051422.html #include<cstdio> #incl ...
- 【题解】Luogu P2605 [ZJOI2010]基站选址
原题传送门:P2604 [ZJOI2010]基站选址 看一眼题目,变知道这题一定是dp 设f[i][j]表示在第i个村庄修建第j个基站且不考虑i+1~n个村庄的最小费用 可以得出f[i][j] = M ...
- 【BZOJ1835】基站选址(线段树)
[BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f ...
- 【LG2605】[ZJOI2010]基站选址
[LG2605][ZJOI2010]基站选址 题面 洛谷 题解 先考虑一下暴力怎么写,设\(f_{i,j}\)表示当前\(dp\)到\(i\),且强制选\(i\),目前共放置\(j\)个的方案数. 那 ...
- 题解 [ZJOI2010]基站选址
题解 [ZJOI2010]基站选址 题面 解析 首先考虑一个暴力的DP, 设\(f[i][k]\)表示第\(k\)个基站设在第\(i\)个村庄,且不考虑后面的村庄的最小费用. 那么有\(f[i][k] ...
- luogu P2605 [ZJOI2010]基站选址 线段树优化dp
LINK:基站选址 md气死我了l达成1结果一直调 显然一个点只建立一个基站 然后可以从左到右进行dp. \(f_{i,j}\)表示强制在i处建立第j个基站的最小值. 暴力枚举转移 复杂度\(n\cd ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- BZOJ1835,LG2605 [ZJOI2010]基站选址
题意 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为\(D_i\) 需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为\(C_i\) 如果在距离第i个村 ...
随机推荐
- 最短路 CF954D Fight Against Traffic
CF954D Fight Against Traffic 题意描述: 给你一张无向图,一共有n个点(2 <= n <= 1000),由m条边连接起来(1 <= m <= 100 ...
- 【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
[SCOI2009]粉刷匠 题目描述 \(windy\)有 \(N\) 条木板需要被粉刷. 每条木板被分为 \(M\) 个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能选择一条 ...
- mysql基本用法
mysql的基本用法 一.创建数据库 create database day02 default character set utf8; -- 创建表 create table user( i ...
- (USB HID) Configuration Descriptor
最近完成了HID的基本收發,使用的配置用了2個Endpoint,把一些特別重要要的地方紀錄下來 整個Configuration 分成4大部分 : 1. Configuration 2. Interfa ...
- Object类和包装类的一些方法
一.instanceof关键字的使用: a instanceof A:判断对象a是否是类A的实例.如果是,返回true:如果不是,返回false. 使用场景:为了避免在向下转型时出现ClassCast ...
- SAP生产订单各种日期的计算说明
生产订单各种日期的计算说明 基本日期.已计划的.确认的日期,介绍一下这些日期的作用和计算方法: 首先我们来介绍一下基本日期: 基本开始日期:表示订单的开始日期 基本完成日期:表示订单的完成日期 我们在 ...
- shevle模块
什么是shevle模块 该模块用于序列化python中的数据,但是序列化已经有pickle了为什么出现了shevle? 因为shevle更加简单,封装了文件的读写操作.load和dump操作, 只有一 ...
- 服务器重启后Jenkins项目部分丢失问题解决方法
1.进入webapps/jenkins/WEB-INF目录下,vi web.xml 2.修改 HUDSON_HOME下的value为/root/.jenkins 3.重启Jenkins:http:/ ...
- jq扩展获取表单值、设置值
不多说,直接上代码 //jq添加插件 (function (window, $) { $.fn.serializeJson = function () { var serializeObj = {}; ...
- Linux 远程登录ssh服务器
1.安装ssh服务器 sudo apt-get install openssh-server 2.在另一端输入ssh IP及密码(或ssh 用户名@IP)就可以远程登录到IP所在计算机