JZOJ 5355. 【NOIP2017提高A组模拟9.9】保命
题目
为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄做一些防火措施,保障自己、猫、奶牛的生命安全。
农夫约的农庄里有N+1 座建筑,排成了一排,编号为0~N。对于0 <=i < N,建筑i 有w[i]头奶牛居住,与建筑i+1 距离为d[i]。建筑N 已装有消防栓,现在,农夫约决定再给k 个建筑安装消防栓,以减小安全隐患。
当火灾来临时,所有奶牛会从所在建筑开始,向大编号方向逃生,直到遇上第一个消防栓(如果本来就在消防栓处,就不用跑了)。农夫约定义了一个隐患值val:所有奶牛逃生距离之和。
农夫约希望让隐患值尽可能小,需要你给他设计一个好方案。
分析
设 \(f_{i,l}\) 表示做到第 \(i\) 个,已经装了 \(l\) 个安全栓时最小答案
转移时枚举一个 \(j\),为了能快速转移,我们需要一些辅助数组
设 \(g_i\) 表示 \(i\) 之前的所有奶牛到 \(i\) 的总逃生距离
\(s_i,d_i\) 分别表示题中 \(w,d\) 的前缀和
那么 \(f_{i,j} = \min f_{j,l-1}+g_i-g_j-(d_{i-1} - d_{j-1})\times s_j\)
对于 \(j=0\) 是为了不越界特殊处理
由于它是 \(O(n^2k)\) 的,我们还需斜率优化
\(Code\)
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 1e6 + 5 , K = 25;
int n , k , pre[N][K] , q[N];
LL f[N][3] , d[N] , dd[N] , s[N] , g[N];
void print(int p , int k)
{
if (p) print(pre[p][k] , k - 1);
else return;
printf("%d " , p - 1);
}
inline double slope(int x , int y , int l)
{
LL X1 , X2;
if (x == 0) X1 = f[x][l & 1 ^ 1];
else X1 = f[x][l & 1 ^ 1] - g[x] + s[x] * d[x - 1];
if (y == 0) X2 = f[y][l & 1 ^ 1];
else X2 = f[y][l & 1 ^ 1] - g[y] + s[y] * d[y - 1];
return 1.0 * (X1 - X2) / (s[x] - s[y]);
}
inline LL read()
{
LL res = 0;
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') res = (res << 3) + (res << 1) + ch - '0' , ch = getchar();
return res;
}
int main()
{
freopen("life.in" , "r" , stdin);
freopen("life.out" , "w" , stdout);
n = read() , k = read();
for(register int i = 1; i <= n; i++) s[i] = read() , d[i] = dd[i] = read();
for(register int i = 1; i <= n + 1; i++)
s[i] += s[i - 1] , d[i] += d[i - 1] , g[i] = g[i - 1] + s[i - 1] * dd[i - 1];
for(register int i = 0; i <= n + 1; i++)
for(register int j = 0; j <= 1; j++) f[i][j] = 1e17;
f[0][0] = 0;
int h , t;
for(register int l = 1; l <= k + 1; l++)
{
q[h = t = 1] = 0;
for(register int i = 1; i <= n + 1; i++)
{
while (h < t && slope(q[h] , q[h + 1] , l) < d[i - 1]) h++;
if (q[h] == 0) f[i][l & 1] = f[q[h]][l & 1 ^ 1] + g[i];
else f[i][l & 1] = f[q[h]][l & 1 ^ 1] + g[i] - g[q[h]] - (d[i - 1] - d[q[h] - 1]) * s[q[h]];
pre[i][l] = q[h];
while (h <= t && slope(q[t - 1] , q[t] , l) > slope(q[t] , i , l)) t--;
q[++t] = i;
}
}
printf("%lld\n" , f[n + 1][(k + 1) & 1]);
print(pre[n + 1][k + 1] , k);
}
JZOJ 5355. 【NOIP2017提高A组模拟9.9】保命的更多相关文章
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)
题目链接: http://172.16.0.132/senior/#main/show/100026 题目: 有一个$n$个点$n$条边的有向图,每条边为$<i,f(i),w(i)>$,意 ...
- 【NOIP2017提高A组模拟9.7】JZOJ 计数题
[NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...
- JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团
100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits Got ...
- JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线
5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...
- JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器
5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...
- 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
[NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...
随机推荐
- jmeter 从多个数中随机取一个值的方法
问题描述:使用jmeter进行接口测试时,遇到枚举值(如:10代表闲置.15代表使用中.20代表维修等)我们需要随机取一个类型传到接口中. 解决思路:通过函数助手查找随机函数,找到__chooseRa ...
- MySQL数据库下载以及启动软件的详细步骤
第一步>>>在浏览器上百度上搜索MySQL 如何判断官网?有官网两个字的或者纯英文解释的大概率就是官网 第二步>>>点击DOWNLOAWDS 第三步>> ...
- Spring IOC源码(二):IOC容器之 刷新前的准备
1.源码解析 prepareRefresh()容器刷新refresh()的第一个方法,是容器刷新前的准备工作. 1 // 容器启动的开始时间 毫秒级 2 private long startupDat ...
- 【Redis场景1】用户登录注册
细节回顾: 关于cookie和session不熟悉的朋友: 建议阅读该博客:https://www.cnblogs.com/ityouknow/p/10856177.html 执行流程: 在单体模式下 ...
- JS传值与应用
问题提出:在进行页面书写的时候,有时候需要进行动态页面拼接,在动态拼接的时候,涉及到函数的调用,函数的传值可能是HTML标签,或者含有json的标签,这样在传值时就有可能出现问题,由于"&q ...
- List排序(降序)
一.添加一个比较器 点击查看代码 import java.util.Comparator; /** * @Classname ComparatorResultType * @Description 排 ...
- 【openEuler系列】部署文件共享服务Samba
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 目录 1 配置环境 2 配置软件安装源 3 安装文 ...
- HTML笨方法仿写站酷
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [生命科学] 生物基础实验之PCR验证
生物基础实验之PCR验证 文章目录 生物基础实验之PCR验证 实验步骤一 实验步骤二 实验步骤三 配胶 实验步骤四 电泳 实验步骤五 跑胶 实验步骤一 在离心管加入7.5μL Master Mix 溶 ...
- CSP-S2022 游记
Day 998244350 模拟赛场场被学弟吊打.最后几天写了一堆随机化乱搞题以及奇怪的搜索,都是 CSP 不曾考的玩意(书接下文). 点分治已经敲烂了.最后两场每场一个. Day 499122175 ...