传送门

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. localstorage在safri下的坑

    在ios10.2中的safri浏览器里无痕模式会导致localstorage不能正常使用 具体解决办法如下: if (typeof localStorage === 'object') { try { ...

  2. 2019.4.3 HTML&CSS 理论部分

    HTML 块标签 1.独占一行,不和其他标签待在一行; 2.能设置宽高 常见的块标签:h1-h6,p,div,table,hr,br,ul,ol, 行标签 1.可以和其他行标签待在一行 2.不能设置宽 ...

  3. odoo 的字段。orm对象

    OpenERP ORM 对象方法列表   OpenERP对象支持的字段类型有,基础类型:char, text, boolean, integer, float, date, time, datetim ...

  4. 2.7 Go channel

    channel简单示例 package main import ( "fmt" "time" ) //channel的创建,发送,接收 func channe1 ...

  5. PHP输出毫秒时间戳

    代码: <?php list($msec, $sec) = explode(' ', microtime()); $msectime = (float)sprintf('%.0f', (floa ...

  6. Java获取永久图文素材中的网页端Url

    package com.epalmpay.test; import com.alibaba.fastjson.JSON;import com.epalmpay.util.HttpClientUtil; ...

  7. Python多线程&进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  8. Fiddler模拟发送post请求

    fiddler在进行接口测试时,会模拟post请求,发送不同的请求参数,返回不同的结果,今天我们就来分享一下,怎么用Fiddler工具模拟post请求: 打开Fiddler工具,在右侧点击“compo ...

  9. Linux多个机器配置ssh免登陆

    多机器ssh免密码登录的教程,网上有很多,多的数不过来,但是我的安装过程不是很顺利,因为刚开始使用的是普通的user,虽然配置了sudo权限,但是没有root权限,导致了无论如何配置都不能实现免密码登 ...

  10. android webview 中 js 模板引擎的使用

    最近在项目中要求用 webview 展示几个界面, 而后台返回的不是 html 而是 json 数据. 起初用 StringBuilder 一个一个拼 html, 后来感觉太繁琐,拼一个还行,拼多了就 ...