P2605 [ZJOI2010]基站选址
P2605 [ZJOI2010]基站选址
题目描述
详见:P2605 [ZJOI2010]基站选址
Solution
首先不难想到一个 的DP。
表示前个村庄选择了个基站的总费用。
考虑如何优化这个转移。
对于村庄,我们记录它覆盖范围内最靠前的村庄 和最靠后的村庄 。
倘若在之后的村庄建立基站,则若上一个基站在之前,那么就会多一个的费用。
增加费用的状态是形如 的连续一段状态。
我们只需要让滚动,维护区间加,询问区间最小值,线段树维护即可。
Ps:luogu题解中很多代码求 时使用的是 再特判减1,但这样如果出现相等的值时,会找到相等的值中第一个值,与 的实际意义不符,但由于我太蒟,不知道会不会对答案产生影响qwq。
Code
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+50;
const int INF=0x3f3f3f3f;
int d[MAXN],a[MAXN],s[MAXN],w[MAXN],fi[MAXN],la[MAXN],f[MAXN];
vector<int> e[MAXN];
inline int read()
{int x=0,f=1; char c=getchar();while (c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
struct Segment_Tree
{struct segnode{int l,r,tag,mn; } tree[MAXN<<2];void up(int x){ tree[x].mn=min(tree[x<<1].mn,tree[x<<1|1].mn); }void down(int x){if (tree[x].tag!=0){int q=tree[x].tag;tree[x<<1].tag+=q,tree[x<<1].mn+=q;tree[x<<1|1].tag+=q,tree[x<<1|1].mn+=q;tree[x].tag=0;}}void build(int x,int l,int r){tree[x].tag=tree[x].mn=0;if ((tree[x].l=l)==(tree[x].r=r)) {tree[x].mn=f[l];return;}int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);up(x);}int query(int x,int l,int r){if (tree[x].l>=l&&tree[x].r<=r) return tree[x].mn;down(x);int mid=(tree[x].l+tree[x].r)>>1;if (r<=mid) return query(x<<1,l,r);else if (l>mid) return query(x<<1|1,l,r);else return min(query(x<<1,l,mid),query(x<<1|1,mid+1,r));}void change(int x,int l,int r,int y){if (tree[x].l>=l&&tree[x].r<=r){tree[x].mn+=y;tree[x].tag+=y;return;}down(x);int mid=(tree[x].l+tree[x].r)>>1;if (r<=mid) change(x<<1,l,r,y);else if (l>mid) change(x<<1|1,l,r,y);else change(x<<1,l,mid,y),change(x<<1|1,mid+1,r,y);up(x);}
} segment;
int main()
{int n=read(),m=read(); for (int i=2;i<=n;i++) d[i]=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<=n;i++) s[i]=read();for (int i=1;i<=n;i++) w[i]=read();n++; d[n]=w[n]=INF;for (int i=1;i<=n;i++){fi[i]=lower_bound(d+1,d+n+1,d[i]-s[i])-d;la[i]=upper_bound(d+1,d+n+1,d[i]+s[i])-d-1;//cout<<i<<" "<<fi[i]<<" "<<la[i]<<endl;e[la[i]].push_back(i);}int cnt=0,ans=0;for (int i=1;i<=n;i++){f[i]=cnt+a[i];for (int k=0;k<e[i].size();k++) cnt+=w[e[i][k]];}ans=f[n];//for (int i=1;i<=n;i++) cout<<i<<" "<<f[i]<<endl;cout<<endl;for (int j=2;j<=m+1;j++){segment.build(1,1,n);for (int i=1;i<=n;i++){if (j>i) f[i]=a[i];else f[i]=segment.query(1,j-1,i-1)+a[i];for (int k=0;k<e[i].size();k++) if (fi[e[i][k]]>1) segment.change(1,1,fi[e[i][k]]-1,w[e[i][k]]);}ans=min(ans,f[n]);}printf("%d\n",ans);return 0;
}
P2605 [ZJOI2010]基站选址相关推荐
- [ZJOI2010] 基站选址(线段树优化dp)
problem luogu-P2605 solution 首先,肯定都能想到最暴力的 dpdpdp. dpi,j:idp_{i,j}:idpi,j:i 个村庄为止一共选了 jjj 个基站,且第 ii ...
- Bzoj1835:[ZJOI2010]基站选址
Sol 设\(f[i][j]\)表示钦定\(i\)建基站,建了\(j\)个基站的最小代价 \(f[i][j]=max(f[l][j-1]+\Sigma_{t=l+1}^{i-1}\)不能影响到的村庄的 ...
- 用布谷鸟算法求解基站选址
用布谷鸟算法求解基站选址 0 Jupyter & Python代码 在这里 1 问题描述 要求:对于给出的数据集–深圳市楼盘带经纬度-设立基站.每个基站的有效覆盖范围为10Km,欲让基站信号覆 ...
- BZOJ1835: [ZJOI2010]base 基站选址(线段树优化Dp)
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- 2017.5.18-24 基站选址 失败总结
先吐槽一下 学校太不厚道了,省赛挂了就不大给我们时间了,一个题都不能好好做了 果然线段树和dp到了zjoi都是怪物 这个题的题目描述非常有诱导性. 对着错误的题目做了5天... 一个基站的范围是指覆盖 ...
- 【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)
正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上,距离第一个村庄did_idi,在该村庄建立基站要花费cic_ici,如果在离该村不大于sis_isi ...
- 【优化布局】matlab基于禁忌搜索算法求解基站选址问题代码
1 简介 物流配送中心选址问题在物流网络规划中占有非常重要的地位,选址的合理与否直接关系到配送中心未来的发展.针对企业选址的一般要求,以配送中心总成本最小为目标,构造了一种物流配送中心选址模型.该模型 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
最新文章
- android pop3与imap方式接收邮件(javamail)
- 【OpenCV 4开发详解】窗口交互操作
- 邮件服务器收件人数量限制,邮件服务器DBMail
- pads layout 中 hatch和flood之区别
- 修复SVCHOST.EXE出现0x745f2780错误
- 开放防火墙的端口号mysql_linux下mysql开启远程访问权限及防火墙开放3306端口
- c++ 构造函数数组_从 JS 数组操作到 V8 array.js
- Scala和Java二种方式实战Spark Streaming开发
- 数据结构试卷及答案(三)
- visio无法修改流程图的形状格式
- office文档图标显示不正常
- ps联盟服务器无响应怎么办,PS联盟网新手教程视频
- 【P3369 普通平衡树】 Splay
- 触动精灵安卓手游内存教程(类人猿手游内存教程系列)
- 为什么外包公司这么不受欢迎??
- 驱动开发:内核遍历进程VAD结构体
- linux美学设计,扁平化设计美学探讨
- 如何用python计算圆周率_如何用python计算圆周率?
- Sobel和Roberts算子的推导过程
- 1.Hue 中运行oozie工作流执行spark 报错 local class incompatible
热门文章
- 老大爷的手法一看就不一般!
- 如何判断一个人是不是值得深入交流?
- 2020年,朋友圈的正确打开方式!
- c语言md5函数 linux,Linux下C语言计算文件的md5值(长度32)
- html游戏怎么做,HTML5 制做“游戏”的一个基本流程
- php 分享微博,php微信分享到朋友圈、QQ、朋友、微博
- java main 声明_Java中main方面面试题
- windows制作定时关机脚本_自动关机、自动打开程序… 让Windows自动执行任何操作...
- 算法题目——读书知识点统计问题(POJ-3320)(尺取法)
- 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come