题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835

题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离为Di。需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci。如果在距离第i个村 庄不超过Si的范围内建立了一个通讯基站,那么就成它被覆盖了。如果第i个村庄没有被覆盖,则需要向他们补偿,费用为Wi。现在的问题是,选择基站的位 置,使得总费用最小。

思路:

另外,程序中的n=n+1,m=m+1。因
为每次使用f[n]更新答案的,而f[n]的含义是在n位置建立一个通讯站,但是显然有时候最优值并不是一定要在n建立一个。将n+1之后,m+1,则
m+1个必然建立在n+1,而这一个在我们计算st和ed数组时看出他们是不对前面的有影响的。因此统计f[n+1]才是正确的。

struct Node
{
    int L,R;
    i64 Min,det;

    void set(i64 x)
    {
        det+=x;
        Min+=x;
    }
};

Node a[N<<2];

void pushUp(int t)
{
    if(a[t].L==a[t].R) return;
    a[t].Min=min(a[t*2].Min,a[t*2+1].Min);
}

i64 f[N],ans;

void build(int t,int L,int R)
{
    a[t].L=L;
    a[t].R=R;
    a[t].det=0;
    if(L==R)
    {
        a[t].Min=f[L];
        return;
    }
    int mid=(L+R)>>1;
    build(t*2,L,mid);
    build(t*2+1,mid+1,R);
    pushUp(t);
}

void pushDown(int t)
{
    if(a[t].L==a[t].R) return;
    if(a[t].det)
    {
        a[t*2].set(a[t].det);
        a[t*2+1].set(a[t].det);
        a[t].det=0;
    }
}

void add(int t,int L,int R,i64 x)
{
    if(L>a[t].R||R<a[t].L) return;

    if(L<=a[t].L&&a[t].R<=R)
    {
        a[t].set(x);
        return;
    }

    pushDown(t);
    add(t*2,L,R,x);
    add(t*2+1,L,R,x);
    pushUp(t);
}

i64 query(int t,int L,int R)
{
    if(L>a[t].R||R<a[t].L) return inf;
    if(L<=a[t].L&&a[t].R<=R) return a[t].Min;

    pushDown(t);
    i64 ans=min(query(t*2,L,R),query(t*2+1,L,R));
    pushUp(t);
    return ans;
}

int n,m,d[N],c[N],s[N],w[N];
int st[N],ed[N];
vector<int> V[N]; 

int getL(int x,int pos)
{
    int low=1,high=pos,mid;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(d[mid]>=x) high=mid-1;
        else low=mid+1;
    }
    if(high>=1&&d[high]>=x) return high;
    return low;
}

int getR(int x,int pos)
{
    int low=pos,high=n,mid;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(d[mid]>x) high=mid-1;
        else low=mid+1;
    }
    if(low<=n&&d[low]<=x) return low;
    return high;
}

void init()
{
    int i;
    FOR1(i,n)
    {
        st[i]=getL(d[i]-s[i],i);
        ed[i]=getR(d[i]+s[i],i);
        V[ed[i]].pb(i);
    }
}

void DP()
{
    build(1,0,n);
    int i,j,k;
    FOR1(i,n)
    {
        f[i]=query(1,0,i-1)+c[i];
        FOR0(j,SZ(V[i]))
        {
            k=V[i][j];
            add(1,0,st[k]-1,w[k]);
        }
    }
    upMin(ans,f[n]);
}

int main()
{
    RD(n,m);
    int i;
    for(i=2;i<=n;i++) RD(d[i]);
    FOR1(i,n) RD(c[i]);
    FOR1(i,n) RD(s[i]);
    FOR1(i,n) RD(w[i]);
    FOR1(i,n) f[i]=inf;
    init();
    ans=inf; n++; m++;
    FOR1(i,m) DP();
    PR(ans);
}

BZOJ 1835 基站选址(线段树优化DP)的更多相关文章

  1. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  2. BZOJ 1835 [ZJOI2010]基站选址 (线段树优化DP)

    题目大意:略 洛谷题面传送门 BZOJ题面传送门 注意题目的描述,是村庄在一个范围内去覆盖基站,而不是基站覆盖村庄,别理解错了 定义$f[i][k]$表示只考虑前i个村庄,一共建了$k$个基站,最后一 ...

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

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

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

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

  5. 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中间的不能被满足的村庄的赔偿金之 ...

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

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

  7. 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 ...

  8. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  9. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  10. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

随机推荐

  1. 《科学》封面:人工智能终于能像人类一样学习 zz

    原文地址:http://tech.sina.com.cn/d/i/2015-12-12/doc-ifxmpnqi6368668.shtml science   Human-level concept ...

  2. yii2语言设置

    1.父配置文件在yii2/base/Application中的$language="en-US", 修改项目的语言可以修改项目的配置文件main.php中加'language'=& ...

  3. asp.net项目发布网上-当前自定义错误设置禁止远程查看应用程序

    早上服务器的系统突然出错了,悲剧~ ==============异常信息:============================== 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止远程 ...

  4. android 学习随笔二十五(动画:补间动画)

    补间动画(TweenAnimation) * 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画(为了让对象从初始状态向结束状态改变的过程更加自然而自动生成的动画效果)* 位移.旋转.缩放.透 ...

  5. Perl 和 Python 的比较 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4662991&uid=608135 作为万年Perl 党表示最近开 ...

  6. c sharp学习 问题记录

    1.函数的调用可以嵌套,定义不可以 C# 参考之方法参数关键字:params.ref及out C#中方法的参数的四种类型

  7. mysql 利用binlog增量备份,还原实例

    mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 标签:binlog, mysql, mysqldump, 增量备份 一,什么是增量备份 增量 ...

  8. 修改ecshop让订单详情里将会员地址详情全部显示

    $sql = "SELECT concat(IFNULL(c.region_name, ''), '  ', IFNULL(p.region_name, ''), " . &quo ...

  9. Python 深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will= ...

  10. U3D UGUI学习3 - RectTransform

    总的来说整合了NGUI很多零散功能,比如NGUI2.X处理拉伸要额外套脚本,NGUI3.X开始引入新的锚点.再加上依赖BoxCollider使得整个HUD显示非常乱 而UGUI很清晰明了,你也能看清楚 ...