题目戳这里

村庄排序。状态\(f[j][i]\)表示考虑前\(i\)个村庄,造\(j\)个邮局且\(i\)造了邮局的最小代价。我们用\(Lb_i,Rb_i\)表示在第\(i\)个村庄造邮局,邮局最左和最右能够服务到的村庄。\(pre_i\)表示\(P\)的前缀和。

\[f[j][i] = C_i + \left\{
\begin{array}{ll}
\min (f[j-1][k]) & Rb_k\ge Lb_i\\
\min (f[j-1][k]+pre_{Lb_i-1}-pre_{Rb_k}) & Rb_k < Lb_i
\end{array} \right.\]

按\(Rb_i\)来建线段树,分别维护\(f[j-1][k]\)和\(f[j-1][k]-pre_{Rb_k}\)最小值即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; const int maxn = 10010,maxm = 110; const int inf = 1<<30;
int N,M,X[maxn],C[maxn],R[maxn],Case,Lbound[maxn],Rbound[maxn],leaf[maxn];
int f[maxm][maxn],P[maxn],tree[4*maxn][2],ans; inline int gi()
{
char ch; int ret = 0,f = 1;
do ch = getchar(); while (!(ch >= '0'&&ch <= '9')&&ch != '-');
if (ch == '-') f = -1,ch = getchar();
do ret = ret*10+ch-'0',ch = getchar(); while (ch >= '0'&&ch <= '9');
return ret*f;
} inline void build(int now,int l,int r,int i)
{
if (l == r) { tree[now][0] = tree[now][1] = inf; leaf[l] = now; return; }
int mid = (l+r) >> 1;
build(now<<1,l,mid,i); build(now<<1|1,mid+1,r,i);
tree[now][0] = tree[now][1] = inf;
} inline void modify(int pos,int a,int b)
{
if (a < tree[leaf[pos]][0])
{
tree[leaf[pos]][0] = a;
for (int now = leaf[pos]>>1;now&&tree[now][0] > a;now >>= 1) tree[now][0] = a;
}
if (b < tree[leaf[pos]][1])
{
tree[leaf[pos]][1] = b;
for (int now = leaf[pos]>>1;now&&tree[now][1] > b;now >>= 1) tree[now][1] = b;
}
} inline int query(int i,int now,int l,int r,int ql,int qr)
{
if (l == ql&&r == qr) return tree[now][i];
int mid = (l+r)>>1;
if (qr <= mid) return query(i,now<<1,l,mid,ql,qr);
else if (ql > mid) return query(i,now<<1|1,mid+1,r,ql,qr);
else return min(query(i,now<<1,l,mid,ql,mid),query(i,now<<1|1,mid+1,r,mid+1,qr));
} int main()
{
freopen("4273.in","r",stdin);
freopen("4273.out","w",stdout);
while (++Case)
{
N = gi(); M = gi(); if (!N&&!M) break;
printf("Case %d: ",Case);
for (int i = 2;i <= N;++i) X[i] = gi();
for (int i = 1;i <= N;++i) C[i] = gi();
for (int i = 1;i <= N;++i) R[i] = gi();
for (int i = 1;i <= N;++i) P[i] = gi()+P[i-1];
for (int i = 1;i <= N;++i) Lbound[i] = lower_bound(X+1,X+N+1,X[i]-R[i])-X,Rbound[i] = upper_bound(X+1,X+N+1,X[i]+R[i])-X-1;
ans = P[N];
for (int i = 1;i <= N;++i) f[1][i] = C[i]+P[Lbound[i]-1],ans = min(ans,f[1][i]+P[N]-P[Rbound[i]]);
for (int i = 2;i <= M;++i)
{
build(1,1,N,i-1);
for (int j = i;j <= N;++j)
{
modify(Rbound[j-1],f[i-1][j-1],f[i-1][j-1]-P[Rbound[j-1]]);
f[i][j] = query(0,1,1,N,Lbound[j],N);
if (Lbound[j]-1) f[i][j] = min(f[i][j],query(1,1,1,N,1,Lbound[j]-1)+P[Lbound[j]-1]);
f[i][j] += C[j];
ans = min(ans,f[i][j]+P[N]-P[Rbound[j]]);
}
}
cout << ans << endl;
}
fclose(stdin); fclose(stdout);
return 0;
}

LA4273 Post Offices的更多相关文章

  1. 如何去破解所有的window和offices(超级全面)

    破解所有的Windows和Offices by方阳 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7107666.html  摘 ...

  2. C - Between the Offices

    Problem description As you may know, MemSQL has American offices in both San Francisco and Seattle. ...

  3. offices 激活

    http://www.xitongcheng.com/jiaocheng/dnrj_article_44577.html  破解工具见cnblos文件中 : https://blog.csdn.net ...

  4. 【Codeforces Round #437 (Div. 2) A】Between the Offices

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using n ...

  5. 【12-26】go.js

    var $ = go.GraphObject.make; // for conciseness in defining templates function buildAlarm(row,column ...

  6. HDOJ 4770 Lights Against Dudely

    状压+暴力搜索 Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. POJ 1160 题解

    Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18835   Accepted: 10158 Des ...

  8. Java基础之类Class使用

    大家都知道Java是一门面向对象编程语言,在Java世界里,万事万物皆对象,那个Java中怎么表示对象呢?Class 我们知道Java中的对象都是Object类的子类,那么今天我们就一起来研究一下Ja ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q128-Q130)

    Question  128 You are designing a SharePoint 2010 solution that includes a custom site definition an ...

随机推荐

  1. 【Hbase一】基础

    此笔记仅用于作者记录复习使用,如有错误地方欢迎留言指正,作者感激不尽,如有转载请指明出处 Hbase基础 Hbase基础 Hbase定义 行存储 v s 列存储 Hbase数据模型 Hbase物理模型 ...

  2. 数据分析处理库Pandas——字符串操作

    字符串小写 字符串大写 字符串长度 去掉字符串中的空格 去掉字符串中的左空格 去掉字符串中的右空格 字符串替换 按字符串切割 字符串是否包含在另一个字符串中

  3. 单片机C51 8位流水灯

    #include<reg51.h> sbit P1_0=0X90; sbit P1_1=0x91; sbit P1_2=0x92; sbit P1_3=0x93; sbit P1_4=0x ...

  4. Linux 之vi与vim

    vi 三种模式: 『一般模式』: 光标 『编辑模式』:i,o,a,r 『指令列命令模式』「:/ ?」 例子: 1. 请在/tmp 这个目录下建立一个名为vitest 的目录: 2. 将/etc/man ...

  5. 理解JAVA常量池

    下面是一些String相关的常见问题: String中的final用法和理解final StringBuffer a = new StringBuffer("111");final ...

  6. CCF-NOIP-2018 提高组(复赛) 模拟试题(四)

    T1 贪吃蛇 [问题描述] 贪吃蛇是一个好玩的游戏.在本题中,你需要对这个游戏进行模拟. 这个游戏在一个 \(n\) 行 \(m\) 列的二维棋盘上进行. 我们用 \((x, y)\) 来表示第 \( ...

  7. (vue01)vue环境搭建

    腾讯,百度,网易....这么大媒体平台咋老推送这么lower的信息? 你们不缺钱啊....我这么善良的孩子都别你们带坏了 强烈鄙视马化腾 强烈鄙视李彦宏 参考地址: https://segmentfa ...

  8. mongodb数据库操作之简单查询

    1. 2. 3.修改器 默认一条一条修改 4. 5.查询 6.mysql简单操作

  9. HDU 1698 Just a Hook(线段树区间覆盖)

    线段树基本操作练习,防手生 #include <cstdio> #include <cstring> #include <cstdlib> #define lson ...

  10. Week8 Teamework from Z.XML-Z.XML游戏功能说明

    我们小组的游戏终于新鲜出炉了,好开心~ 快来看看有什么功能吧. 游戏目标::=打倒最多的敌人,获得积分,放松心情,获取快乐. 游戏菜单::= 关于+设置+帮助+积分榜+开始游戏吧 (截图还在路上..) ...