传送门

n年前的考试题,今天才填上……

听说你们会决策单调性+主席树?然而我多年不写决策单调性,懒得写了……于是就写了一发线段树。

其实线段树应该不难想,毕竟转移是分层转移,并且这个题的转移函数可以快速从$i$更新到$i+1$,这样就给线段树带来了不少方便。

每个村庄的$s$的限制可以看成一条线段,那么我们在扫过一个线段的右端点时把左端点以左的点都加上这条线段的代价,更新完之后求区间最小值即可,显然可以方便地用线段树来维护区间增量和区间最值。然后就没有然后了。

 /**************************************************************
Problem: 1835
User: hzoier
Language: C++
Result: Accepted
Time:6572 ms
Memory:10592 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=,maxk=;
struct A{
int l,r,w;
bool operator<(const A &a)const{return r<a.r;}
}a[maxn];
void build(int,int,int);
void modify(int,int,int,int,int,int);
int query(int,int,int,int,int);
int mn[maxn<<],lazy[maxn<<];
int d[maxn],c[maxn],s[maxn],w[maxn];
int n,m,k,f[maxn][maxk],ans=;
int main(){
scanf("%d%d",&n,&m);
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",&a[i].w);
a[i].l=lower_bound(d+,d+n+,d[i]-s[i])-d;
a[i].r=upper_bound(d+,d+n+,d[i]+s[i])-d-;
f[a[i].r+][]+=a[i].w;
w[a[i].l-]+=a[i].w;
ans+=a[i].w;//printf("l=%d r=%d w=%d\n",a[i].l,a[i].r,a[i].w);
}
sort(a+,a+n+);
for(int i=;i<=n;i++)f[i][]+=f[i-][];
for(int i=n;i;i--)w[i]+=w[i+];
for(int i=;i<=n;i++){
f[i][]+=c[i];
ans=min(ans,f[i][]+w[i]);
}
//for(int i=1;i<=n;i++)printf("f[%d][0]=%d w=%d\n",i,f[i][0],w[i]);
f[][]=c[];
for(k=;k<=m;k++){
int cur=;
build(,n,);
for(int i=k;i<=n;i++){
while(cur<=n&&a[cur].r<i){
if(a[cur].l>=k)modify(k-,a[cur].l-,a[cur].w,,n,);//printf("%d~%d += %d\n",1,a[cur].l-1,a[cur].w);
cur++;
}
f[i][k]=query(k-,i-,,n,)+c[i];//printf("f[%d][%d]=%d c[i]=%d\n",i,k,f[i][k],c[i]);
ans=min(ans,f[i][k]+w[i]);
}
}
printf("%d",ans);
return ;
}
void build(int l,int r,int rt){
lazy[rt]=;
if(l==r){
mn[rt]=f[l][k-];
return;
}
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
mn[rt]=min(mn[rt<<],mn[rt<<|]);
}
void modify(int s,int t,int d,int l,int r,int rt){
if(s<=l&&t>=r){
mn[rt]+=d;
lazy[rt]+=d;
return;
}
int mid=(l+r)>>;
if(s<=mid)modify(s,t,d,l,mid,rt<<);
if(t>mid)modify(s,t,d,mid+,r,rt<<|);
mn[rt]=min(mn[rt<<],mn[rt<<|])+lazy[rt];
}
int query(int s,int t,int l,int r,int rt){
if(s<=l&&t>=r)return mn[rt];
int mid=(l+r)>>;
if(t<=mid)return query(s,t,l,mid,rt<<)+lazy[rt];
if(s>mid)return query(s,t,mid+,r,rt<<|)+lazy[rt];
return min(query(s,t,l,mid,rt<<),query(s,t,mid+,r,rt<<|))+lazy[rt];
}

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

  1. BZOJ 1835: [ZJOI2010]base 基站选址 [序列DP 线段树]

    1835: [ZJOI2010]base 基站选址 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立 ...

  2. 【BZOJ1835】[ZJOI2010]base 基站选址 线段树+DP

    [BZOJ1835][ZJOI2010]base 基站选址 Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯 ...

  3. bzoj1835[ZJOI2010]base基站选址

    据说正解是什么线段树优化DP,但是作为脑子有坑选手,我们需要5k的做法: 主席树+决策单调性..... F[m][i]表示已经放置了m个基站,第m个基站放置在第i个村庄,第i个村庄及之前的村庄的总最少 ...

  4. bzoj 1835: [ZJOI2010]base 基站选址

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

  5. BZOJ1835: [ZJOI2010]base 基站选址【线段树优化DP】

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

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

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

  7. bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...

  8. BZOJ 1835 [ZJOI2010]base 基站选址:线段树优化dp

    传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基 ...

  9. bzoj 1835/luogu P2605 : [ZJOI2010]base 基站选址

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

随机推荐

  1. Oracle 第三方管理工具整理

    Oracle 第三方管理工具整理 1.OB(SI Object Browser) 官方网址: http://www.ctdw.com.cn说明:小软件大功能,个人最爱它的数据库导入.导出功能,一键导入 ...

  2. tomcat在bin下的startup.bat下启动报错

    测试环境是否安装配置好. 如果环境配置好.报错如下:或者是730013 -----------解决问题:是因为tomcat端口被占用.查看是否启动两个tomcat

  3. bzoj 4032(A的一个最短的子串,它不是B的子串 || A的一个最短的子串,它不是B的子序列 || A的一个最短的子序列,它不是B的子串||A的一个最短的子序列,它不是B的子序列)

    在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以不连续的一 ...

  4. Codeforces - tag::graphs 大合集 [占坑]

    520B 给定初始n和目标m,存在两种操作\(-1\)和\(×2\),要求最少操作次数 无脑解法是BFS,不能解决稍大的规模 当n>m时,输出n-m 否则逆向处理,转换为m到n的最小操作次数,存 ...

  5. 在vue中import()语法不能传入变量

    解决办法: 一定要用变量的时候,可以通过字符串模板来提供部分信息给webpack:例如import(`./path/${myFile}`), 这样编译时会编译所有./path下的模块,但运行时确定my ...

  6. JavaScript 刷题一

    最近读<JavaScirpt编程精解>,想把里面的三个大的程序实现,现在记录下来. 问题一: 从下面这封信中,emily奶奶每封信的结尾都会用同样的格式注明哪只猫出生了,哪只猫死去了.现要 ...

  7. Python时间calender模块介绍

    获取某月日历 Calendar模块有很广泛的方法用来处理年历和月历,例如打印某月的月历: #!/usr/bin/python # -*- coding: UTF-8 -*- import calend ...

  8. input中的内容改变时触发的事件

    input中的内容改变时触发的事件 1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发:onproperty ...

  9. 1.CSS中的定位机制

    标准文档流(Normal flow) 特点: 从上到下,从左到右,输出文档内容 由块级元素和行级元素组成 块级元素: 从左到右撑满页面,独占一行 触碰到页面边缘时,会自动换行 块级标签: div.ul ...

  10. spring自定义标签之 自我实现

     引言: 最近心情比较难以平静,周末的两天就跑出去散心了,西湖边上走走,看日落,还是不错的.回来博客上发现,在自定义标签上,最后一步实现忘记加上了.其实,人生的路程中,我们总是实现着自我的价值,让自己 ...