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]基站选址相关推荐

  1. [ZJOI2010] 基站选址(线段树优化dp)

    problem luogu-P2605 solution 首先,肯定都能想到最暴力的 dpdpdp. dpi,j:idp_{i,j}:idpi,j​:i 个村庄为止一共选了 jjj 个基站,且第 ii ...

  2. Bzoj1835:[ZJOI2010]基站选址

    Sol 设\(f[i][j]\)表示钦定\(i\)建基站,建了\(j\)个基站的最小代价 \(f[i][j]=max(f[l][j-1]+\Sigma_{t=l+1}^{i-1}\)不能影响到的村庄的 ...

  3. 用布谷鸟算法求解基站选址

    用布谷鸟算法求解基站选址 0 Jupyter & Python代码 在这里 1 问题描述 要求:对于给出的数据集–深圳市楼盘带经纬度-设立基站.每个基站的有效覆盖范围为10Km,欲让基站信号覆 ...

  4. BZOJ1835: [ZJOI2010]base 基站选址(线段树优化Dp)

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

  5. 2017.5.18-24 基站选址 失败总结

    先吐槽一下 学校太不厚道了,省赛挂了就不大给我们时间了,一个题都不能好好做了 果然线段树和dp到了zjoi都是怪物 这个题的题目描述非常有诱导性. 对着错误的题目做了5天... 一个基站的范围是指覆盖 ...

  6. 【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)

    正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上,距离第一个村庄did_idi​,在该村庄建立基站要花费cic_ici​,如果在离该村不大于sis_isi ...

  7. 【优化布局】matlab基于禁忌搜索算法求解基站选址问题代码

    1 简介 物流配送中心选址问题在物流网络规划中占有非常重要的地位,选址的合理与否直接关系到配送中心未来的发展.针对企业选址的一般要求,以配送中心总成本最小为目标,构造了一种物流配送中心选址模型.该模型 ...

  8. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  9. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

最新文章

  1. android pop3与imap方式接收邮件(javamail)
  2. 【OpenCV 4开发详解】窗口交互操作
  3. 邮件服务器收件人数量限制,邮件服务器DBMail
  4. pads layout 中 hatch和flood之区别
  5. 修复SVCHOST.EXE出现0x745f2780错误
  6. 开放防火墙的端口号mysql_linux下mysql开启远程访问权限及防火墙开放3306端口
  7. c++ 构造函数数组_从 JS 数组操作到 V8 array.js
  8. Scala和Java二种方式实战Spark Streaming开发
  9. 数据结构试卷及答案(三)
  10. visio无法修改流程图的形状格式
  11. office文档图标显示不正常
  12. ps联盟服务器无响应怎么办,PS联盟网新手教程视频
  13. 【P3369 普通平衡树】 Splay
  14. 触动精灵安卓手游内存教程(类人猿手游内存教程系列)
  15. 为什么外包公司这么不受欢迎??
  16. 驱动开发:内核遍历进程VAD结构体
  17. linux美学设计,扁平化设计美学探讨
  18. 如何用python计算圆周率_如何用python计算圆周率?
  19. Sobel和Roberts算子的推导过程
  20. 1.Hue 中运行oozie工作流执行spark 报错 local class incompatible

热门文章

  1. 老大爷的手法一看就不一般!
  2. 如何判断一个人是不是值得深入交流?
  3. 2020年,朋友圈的正确打开方式!
  4. c语言md5函数 linux,Linux下C语言计算文件的md5值(长度32)
  5. html游戏怎么做,HTML5 制做“游戏”的一个基本流程
  6. php 分享微博,php微信分享到朋友圈、QQ、朋友、微博
  7. java main 声明_Java中main方面面试题
  8. windows制作定时关机脚本_自动关机、自动打开程序… 让Windows自动执行任何操作...
  9. 算法题目——读书知识点统计问题(POJ-3320)(尺取法)
  10. 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come