luogu2605 基站选址 (线段树优化dp)
设f[i][j]表示在第i个村庄建第j个基站的花费
那么有$f[i][j]=min\{f[k][j-1]+w[k,i]\}$,其中w[k,i]表示在k,i建基站,k,i中间的不能被满足的村庄的赔偿金之和
如果把每个村庄能被满足的区间处理出来,记做$[l_i,r_i]$,那么i,j不能满足的村庄,就是$i<l,r<j$的村庄
考虑将$f[i][k]+w[i,j]$的i固定,而j随着dp进行而变化,这样维护K个线段树
那么当j越来越大,会有更多的村庄[l,r]变得满足r<j,被加入到线段树的区间[1,l-1]中
用堆来维护这些村庄,按r从大到小排序即可
复杂度$O(nklogn)$
#include<bits/stdc++.h>
#define pa pair<ll,ll>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
const int maxn=2e4+,maxk=; inline char gc(){
return getchar();
static const int maxs=<<;static char buf[maxs],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,maxs,stdin),p1==p2)?EOF:*p1++;
}
inline ll rd(){
ll x=;char c=gc();bool neg=;
while(c<''||c>''){if(c=='-') neg=;c=gc();}
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
return neg?(~x+):x;
} int N,K,f[maxn][maxk],pos[maxn],cost[maxn];
struct Node{
int l,r,w;
}p[maxn];
int mi[maxk*maxn*],laz[maxk*maxn*],ch[maxk*maxn*][],rt[maxk],pct;
inline bool operator < (Node a,Node b){return a.r>b.r;}
priority_queue<Node> q; inline void tag(int p,int v){
mi[p]+=v,laz[p]+=v;
} inline void pushdown(int p){
if(!laz[p]) return;
int a=ch[p][],b=ch[p][];
if(a) tag(a,laz[p]);
if(b) tag(b,laz[p]);
laz[p]=;
}
inline void update(int p){
mi[p]=min(mi[ch[p][]],mi[ch[p][]]);
} inline void add(int p,int l,int r,int x,int y,int z){
if(x<=l&&r<=y) tag(p,z);
else{
pushdown(p);int m=l+r>>;
if(x<=m) add(ch[p][],l,m,x,y,z);
if(y>=m+) add(ch[p][],m+,r,x,y,z);
update(p);
}
} inline int query(int p,int l,int r,int x,int y){
if(x<=l&&r<=y) return mi[p];
int m=l+r>>;pushdown(p);int re=1e9;
if(x<=m) re=query(ch[p][],l,m,x,y);
if(y>=m+) re=min(re,query(ch[p][],m+,r,x,y));
return re;
} inline void change(int p,int l,int r,int x,int y){
if(l==r) mi[p]=y;
else{
int m=l+r>>;pushdown(p);
if(x<=m) change(ch[p][],l,m,x,y);
else change(ch[p][],m+,r,x,y);
update(p);
}
} inline void build(int &p,int l,int r){
p=++pct;mi[p]=1e9+;
if(l<r){
int m=l+r>>;
build(ch[p][],l,m);build(ch[p][],m+,r);
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),K=rd();
for(i=;i<=N;i++)
pos[i]=rd();
for(i=;i<=N;i++)
cost[i]=rd();
pos[N+]=1e9+;
for(i=;i<=N;i++){
int s=rd();
p[i].l=lower_bound(pos+,pos+N+,pos[i]-s)-pos;
p[i].r=upper_bound(pos+,pos+N+,pos[i]+s)-pos-;
}
for(i=;i<=N;i++)
p[i].w=rd();
p[N+].l=N+,p[N+].r=N+,p[N+].w=,N++,K++;
CLR(f,);f[][]=;
for(i=;i<=K;i++) build(rt[i],,N);
for(i=;i<=N;i++){
while(!q.empty()){
Node p=q.top();
if(p.r>=i) break;
q.pop();f[][]+=p.w;
for(k=;k<=min(p.l-,K);k++)
add(rt[k],,N,,p.l-,p.w);
}
f[i][]=f[][]+cost[i];change(rt[],,N,i,f[i][]);
for(k=;k<=min(i,K);k++){
f[i][k]=query(rt[k-],,N,,i-)+cost[i];
change(rt[k],,N,i,f[i][k]);
}
q.push(p[i]);
}
int ans=2e9;
for(i=;i<=K;i++) ans=min(ans,f[N][i]);
printf("%d\n",ans);
return ;
}
luogu2605 基站选址 (线段树优化dp)的更多相关文章
- 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$
正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- luogu P2605 [ZJOI2010]基站选址 线段树优化dp
LINK:基站选址 md气死我了l达成1结果一直调 显然一个点只建立一个基站 然后可以从左到右进行dp. \(f_{i,j}\)表示强制在i处建立第j个基站的最小值. 暴力枚举转移 复杂度\(n\cd ...
- BZOJ 1835 [ZJOI2010]基站选址 (线段树优化DP)
题目大意:略 洛谷题面传送门 BZOJ题面传送门 注意题目的描述,是村庄在一个范围内去覆盖基站,而不是基站覆盖村庄,别理解错了 定义$f[i][k]$表示只考虑前i个村庄,一共建了$k$个基站,最后一 ...
- BZOJ1835: [ZJOI2010]base 基站选址(线段树优化Dp)
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- Codeforces Round #426 (Div. 2) D 线段树优化dp
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
- [AGC011F] Train Service Planning [线段树优化dp+思维]
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...
- 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...
随机推荐
- CodeIgniter框架通过URL向控制器传递参数
通过URL传递参数的方法是GET,在CodeIgnter框架中,通过URL有两种方式向控制器传递参数: 一种是键值对的形式. 一种是类似于文件路径的形式,这个时候,不是以键值对的形式了,我们只传递值. ...
- 【学习总结】vi/vim命令是使用
每次要么想不起来用,要么进去了出不来,真是醉了.痛定思痛此处填坑. 参考教程:菜鸟教程vi/vim 实验环境:借Git-bash宝地一用 注意:记住关键的步骤! 按i a o进入输入模式(即使有时按v ...
- Servlet--HttpServlet实现doGet和doPost请求的原理
转:https://blog.csdn.net/m0_38039437/article/details/75264012 一.HttpServlet简介 1.HttpServlet是GenericSe ...
- syncthing 多主机同步文件工具
周五看了下阮一峰的blog 看到有一个 syncthing的小工具挺好用的 进行了简单的尝试: 1. 下载文件位置: https://syncthing.net 2. 下载文件后的简单安装 绿色版直接 ...
- [转帖]Centos7 yum安装Chrome浏览器
Centos7 yum安装Chrome浏览器 https://www.cnblogs.com/ianduin/p/8727333.html以及https://blog.csdn.net/libaine ...
- spring AOP源码分析(三)
在上一篇文章 spring AOP源码分析(二)中,我们已经知道如何生成一个代理对象了,那么当代理对象调用代理方法时,增强行为也就是拦截器是如何发挥作用的呢?接下来我们将介绍JDK动态代理和cglib ...
- Mermaid js与流程图、甘特图..
https://mermaidjs.github.io/gantt.html https://github.com/jdbranham/grafana-diagram 用 mermaid 画甘特图 h ...
- RPC框架-RMI、RPC和CORBA的区别
关键词:RMI RPC CORBA简 介:本篇文章重点阐述RMI,附带介绍RPC和CORBA Java远程方法调用(Java RMI)是一组实现了远程方法调用(rmi)的API. java RMI是远 ...
- Flutter上拉加载下拉刷新---flutter_easyrefresh
前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...
- Golang的方法传递值应该注意的地方
其实最近看了不少Golang接口以及方法的阐述都有一个地方没说得特别明白.就是在Golang编译隐式转换传递给方法使用的时候,和调用函数时的区别. 我们都知道,在我们为一个类型变量申明了一个方法的时候 ...