BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】
题目分析:
首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价。
仔细思考两个基站之间村庄的代价,会发现对于一个村庄,它需要付出代价的时候当且仅当上一个基站控制不到它,下一个基站也控制不到它,所以可以计算使它不付出代价的基站区间,然后在超过这段区间的时候加影响。具体来说就是在线段树上面加w[i]。注意滚动数组。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ;
const int inf = ; int n,k;
int d[maxn],c[maxn],s[maxn],w[maxn];
int l[maxn],r[maxn]; int Minn[][<<],lazy[][<<]; void read(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
for(int i=;i<=n;i++) scanf("%d",&c[i]);
for(int i=;i<=n;i++) scanf("%d",&s[i]);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
} void push_down(int dd,int now){
if(Minn[dd][now<<] != inf){
Minn[dd][now<<] += lazy[dd][now];
lazy[dd][now<<] += lazy[dd][now];
}
if(Minn[dd][now<<|] != inf){
Minn[dd][now<<|] += lazy[dd][now];
lazy[dd][now<<|] += lazy[dd][now];
}
lazy[dd][now] = ;
} void push_up(int dd,int now){
Minn[dd][now] = min(Minn[dd][now<<],Minn[dd][now<<|]);
} void Modify(int dd,int now,int tl,int tr,int l,int r,int dt){
if(Minn[dd][now] == inf) return;
if(tl >= l && tr <= r){Minn[dd][now]+=dt; lazy[dd][now]+=dt;return;}
if(tl > r || tr < l){return;}
if(lazy[dd][now]) push_down(dd,now);
int mid = (tl+tr)/;
Modify(dd,now<<,tl,mid,l,r,dt);
Modify(dd,now<<|,mid+,tr,l,r,dt);
push_up(dd,now);
} int Query(int dd,int now,int tl,int tr,int l,int r){
if(tl >= l && tr <= r){return Minn[dd][now];}
if(tl > r || tr < l){return inf;}
if(lazy[dd][now]) push_down(dd,now);
int mid = (tl+tr)/;
int ans=min(Query(dd,now<<,tl,mid,l,r),Query(dd,now<<|,mid+,tr,l,r));
push_up(dd,now);
return ans;
} vector <int> g[maxn];
void init(){
for(int i=;i<=n;i++){
int lft = ,rgt = i;
while(lft < rgt){
int mid = (lft+rgt)/;
if(d[i]-d[mid] > s[i]) lft = mid+; else rgt = mid;
}
l[i] = lft; lft = i,rgt = n;
while(lft < rgt){
int mid = (lft+rgt+)/;
if(d[mid]-d[i] > s[i]) rgt = mid-; else lft = mid;
}
r[i] = lft;
}
for(int i=;i<=n;i++){g[r[i]+].push_back(i);}
} void work(){
init(); n++;int ans=;
for(int i=;i<=n;i++){ans += w[i]; Modify(,,,n,i,i,inf);}
for(int j=,od=;j<=k+;j++,od^=){
memset(Minn[od],,sizeof(Minn[od]));
memset(lazy[od],,sizeof(lazy[od]));
int z = c[j];
for(int i=;i<j;i++) z+=c[i],Modify(od,,,n,i,i,inf);
Modify(od,,,n,j,j,z);
int pp = ;
for(int i=;i<=n;i++){
for(int st=;st<g[i].size();st++){
Modify(od^,,,n,,l[g[i][st]]-,w[g[i][st]]);
pp += w[g[i][st]];
}
if(i <= j) continue;
Modify(od,,,n,i,i,min(Query(od^,,,n,,i-),pp)+c[i]);
}
ans = min(ans,Query(od,,,n,n,n));
}
printf("%d",ans);
} int main(){
read();
work();
return ;
}
BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】的更多相关文章
- 【BZOJ1835】基站选址(线段树)
[BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f ...
- 【洛谷2605】[ZJOI2010] 基站选址(线段树维护DP)
点此看题面 大致题意: 有\(n\)个村庄,每个村庄有\(4\)个属性:\(D_i\)表示与村庄\(1\)的距离,\(C_i\)表示建立基站的费用,\(S_i\)表示能将其覆盖的建基站范围,\(W_i ...
- bzoj 1835 base 基站选址 - 动态规划 - 线段树
题目传送门 需要高级权限的传送门 题目大意 有$n$个村庄坐落在一条直线上,第$i \ \ \ (i>1)$个村庄距离第$1$个村庄的距离为$D_i$.需要在这些村庄中建立不超过$K$个通讯基站 ...
- [ZJOI2010]基站选址(线段树优化dp)
坑待填. \(Code\ Below:\) #include <bits/stdc++.h> #define lson (rt<<1) #define rson (rt< ...
- 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 基站选址:线段树优化dp
传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基 ...
- BZOJ 1835 基站选址(线段树优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离 ...
- bzoj1835[ZJOI2010]基站选址
主席树+决策单调,重写一遍比之前短多了……题解:http://www.cnblogs.com/liu-runda/p/6051422.html #include<cstdio> #incl ...
随机推荐
- Raspberry Zero 上实现平滑视频图传
在某些应用场合我们可能需要通过一个设备通过WIFI将图像传到其它的机器进行显示或者图形分析,那怎么可以低成本地实现呢?其实很简单,我们只需要一块 Raspberry Zero W 和一个RPI 摄像头 ...
- 基于node.js的博客搭建
一个博客应当具备哪些功能? 前台展示 点击下一页,可以点击分类导航. 可以点击进入到具体博文页面 下方允许评论.显示发表时间.允许留言分页. 右侧有登录注册界面. 后台管理 管理员账号:登陆后看到页面 ...
- python四:函数练习--小白博客
为什么要有函数?函数式编程定义一次,多出调用函数在一定程度上可以理解为变量函数的内存地址加上()就是调用函数本身也可以当做参数去传参 不用函数:组织结构不清晰代码的重复性 def test():#te ...
- BZOJ1997 平面图判定 平面图性质 2-sat
相交的两条边不能在同一侧,用2-sat即可. 平面图点数-边数关系 \(E\le 3V-6\) 写这篇文章我只是想说明,知乎一小时,题解一分钟. lb Zhihu, gos langar Qarwet ...
- 2017湘潭大学邀请赛H题(树的直径)
链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE H. Highway The input contains zero or more test cas ...
- 打开指定测试App的指定Activity
那究竟应该如何让appium去自动找到指定的APP和指定的Activity呢?想要打开指定的App,需要知道App的包名,同样想要打开指定Activity也需要知道其名,如何获取? 1.问公司的开发人 ...
- 使用Charles对iPhone进行Http(s)请求拦截(抓包)
首先准备工具 1> Charles (下载对应操作系统的安装包进行安装,本文使用 macOS 进行演示) 2> iPhone (本文使用SE,系统版本:iOS 10) 开始 首先,对Cha ...
- PAT L3-007 天梯地图
https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输 ...
- python3 九九乘法表打印花式操作(然并卵)
# 九九乘法表# 方法一# for i in range(1, 10):# for j in range(1, i+1):# print('{}x{}={}\t'.format(i, j, i*j), ...
- vue router 根据不同的id切换链接界面不刷新
我们一般使用vue的router时候会根据不同的id来切换界面,但是界面没有立刻刷新.下面我们讲下如何解决这个问题. html: <template> <div id="a ...