主席树+决策单调,重写一遍比之前短多了……题解:http://www.cnblogs.com/liu-runda/p/6051422.html

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=;
int n;
struct node{
int sum;node* ch[];
node(){}
node(int x){sum=x;ch[]=ch[]=;}
}t[maxn*],*root[maxn];int cnt=;
node* newnode(int x){t[++cnt]=node(x);return t+cnt;}
void Insert(node* rt0,node* &rt,int l,int r,int k,int x){
rt=new node(rt0->sum+x);
if(l==r)return;
int mid=(l+r)>>;
if(k<=mid){
Insert(rt0->ch[],rt->ch[],l,mid,k,x);
rt->ch[]=rt0->ch[];
}else{
Insert(rt0->ch[],rt->ch[],mid+,r,k,x);
rt->ch[]=rt0->ch[];
}
}
int query(node* rt0,node* rt1,int l,int r,int ql,int qr){
if(ql>qr)return ;
if(ql<=l&&r<=qr)return rt1->sum-rt0->sum;
int mid=(l+r)>>,ans=;
if(ql<=mid)ans+=query(rt0->ch[],rt1->ch[],l,mid,ql,qr);
if(qr>mid) ans+=query(rt0->ch[],rt1->ch[],mid+,r,ql,qr);
return ans;
}
int f[][maxn];
int d[maxn],c[maxn],s[maxn],w[maxn];
struct data{
int l,r,w;
}range[maxn];
vector<data> D[maxn];
void solve(int j,int l,int r,int L,int R){
if(l>r)return;
int mid=(l+r)>>,g=;
f[j][mid]=0x7fffffff;
for(int i=L;i<=R&&i<mid;++i){
int tmp=f[j-][i]+query(root[i],root[mid-],,n,i+,mid-)+c[mid];
if(tmp<f[j][mid]){
f[j][mid]=tmp;g=i;
}
}
solve(j,l,mid-,L,g);solve(j,mid+,r,g,R);
}
int main(){
int k;scanf("%d%d",&n,&k);
d[]=0x80808080;d[n+]=0x7fffffff;
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]);
for(int i=;i<=n;++i){
range[i].l=lower_bound(d,d+n+,d[i]-s[i])-d;range[i].r=upper_bound(d,d+n+,d[i]+s[i])-d-;
range[i].w=w[i];
D[range[i].l].push_back(range[i]);
}
root[]=t+;root[]->ch[]=root[]->ch[]=t+;root[]->sum=;
for(int i=;i<=n;++i){
root[i]=root[i-];
for(vector<data>::iterator pt=D[i].begin();pt!=D[i].end();++pt){
Insert(root[i],root[i],,n,pt->r,pt->w);
}
}
root[n+]=root[n];
int ans=;for(int i=;i<=n;++i)ans+=w[i];
for(int i=;i<=n;++i){
f[][i]=query(root[],root[i-],,n,,i-)+c[i];//printf("...%d\n",f[1][i]);
ans=min(ans,f[][i]+query(root[i],root[n],,n,i+,n));//printf("%d\n",ans);
}//printf("%d\n",ans);
for(int j=;j<=k;++j){
solve(j,,n,,n);
for(int i=;i<=n;++i)ans=min(ans,f[j][i]+query(root[i],root[n],,n,i+,n));
}
printf("%d\n",ans);
return ;
}

bzoj1835[ZJOI2010]基站选址的更多相关文章

  1. BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】

    题目分析: 首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价. 仔细思考两个基站之间村庄的 ...

  2. 【题解】Luogu P2605 [ZJOI2010]基站选址

    原题传送门:P2604 [ZJOI2010]基站选址 看一眼题目,变知道这题一定是dp 设f[i][j]表示在第i个村庄修建第j个基站且不考虑i+1~n个村庄的最小费用 可以得出f[i][j] = M ...

  3. 【BZOJ1835】基站选址(线段树)

    [BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f ...

  4. 【LG2605】[ZJOI2010]基站选址

    [LG2605][ZJOI2010]基站选址 题面 洛谷 题解 先考虑一下暴力怎么写,设\(f_{i,j}\)表示当前\(dp\)到\(i\),且强制选\(i\),目前共放置\(j\)个的方案数. 那 ...

  5. 题解 [ZJOI2010]基站选址

    题解 [ZJOI2010]基站选址 题面 解析 首先考虑一个暴力的DP, 设\(f[i][k]\)表示第\(k\)个基站设在第\(i\)个村庄,且不考虑后面的村庄的最小费用. 那么有\(f[i][k] ...

  6. luogu P2605 [ZJOI2010]基站选址 线段树优化dp

    LINK:基站选址 md气死我了l达成1结果一直调 显然一个点只建立一个基站 然后可以从左到右进行dp. \(f_{i,j}\)表示强制在i处建立第j个基站的最小值. 暴力枚举转移 复杂度\(n\cd ...

  7. [ZJOI2010]基站选址,线段树优化DP

    G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...

  8. BZOJ1835,LG2605 [ZJOI2010]基站选址

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

  9. Bzoj1835:[ZJOI2010]基站选址

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

随机推荐

  1. SSM-Spring-23:概念《Spring中的事务是什么?》

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会详细讲述Spring中的事务,会展开来用语言解释,用于了解概念和准备面试 事务的概念: 一个或者一组 ...

  2. spring源码-自定义标签-4

    一.自定义标签,自定义标签在使用上面相对来说非常常见了,这个也算是spring对于容器的拓展.通过自定义标签的方式可以创造出很多新的配置方式,并且交给容器直接管理,不需要人工太多的关注.这也是spri ...

  3. iOS WKWebView添加进度条02

    之前写了一个是关于webview添加进度条的,现在补一个WKWebView进度条. //添加一个全局属性 @property(nonatomic,strong)CALayer *progresslay ...

  4. Objective-C 内存管理和ARC

    内存管理 范围: 任何继承了NSObject的对象 对基本数据类型无效 原理: 每个对象内部都保存了一个与之相关联的整数 称为引用计数器 1.计数器的基本操作 当使用alloc new或者copy创建 ...

  5. 397. Longest Continuous Increasing Subsequence

    Description Give an integer array,find the longest increasing continuous subsequence in this array. ...

  6. 《Git学习指南》学习笔记(一)

    第二章 入门 git的安装 在Linux下,git的安装很简单.以我的系统Deepin/Ubuntu为例,只需在终端敲入sudo apt-get install git即可.其他Linux发行版可尝试 ...

  7. [SHELL]shell中变量的使用

    1.输出变量 : #! /bin/bash my_var=BOB echo $my_var echo "hi,$my_var" echo "the price is \$ ...

  8. 复合词 (Compund Word,UVa 10391)

    题目描述: 题目思路: 用map保存所有单词赋键值1,拆分单词,用map检查是否都为1,即为复合词 #include <iostream> #include <string> ...

  9. 正则表达式 和 re 模块

    正则表达式究竟是什么? 在一些网站注册的时候需要输入手机号码,当你输入一个错误的手机号码的时候,会提示你输入的手机号码格式错误 那么他究竟是如何判断的呢? 我们用Python代码进行表示: phone ...

  10. C struct中的位域 bitfield

    C struct中的位域 bitfield 结构体的成员可以限制其位域,每个成员可以使用用比字节还小的取值范围,下面的结构体s1中,四个成员每个成员都是2bit的值(0~3),整个结构体占据的空间依然 ...