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 ...
随机推荐
- 【Scala】上:学习文档、文章、思维导图
〇.可查阅资料 1.文档 英文文档:https://tool.oschina.net/apidocs/apidoc?api=scala-docs-2.9.2 与java:https://docs.sc ...
- python重要内置模块
目录 包的概念 包的具体使用 编程思想的转变 常用内置模块之collections模块 (收集) 常用内置模块之time模块 (时间) 常用内置模块之random模块 (随机) os模块 sys模块 ...
- go-carbon 1.5.0 版本发布,修复已知 bug 和新增德语翻译文件
carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github:github.com/g ...
- Flask框架使用SQLAlchemy的ORM
SQLAlchemy 1.介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用 ...
- XSS漏洞利用案例实验
前言 此为XSS漏洞学习笔记,记录XSS的学习过程,方便今后复习使用,有写的不好的地方请见谅,大佬勿喷. GET型XSS利用 攻击流程 攻击实现 以pikachu网站的反射型XSS(GET)为例 攻击 ...
- 2022NewStarCTF新生赛一些比较有意思的题目wp
Misc_蚁剑流量分析 Pcap的文件可以直接使用工具 编辑器打开目录,一个一个看,可以找到eval危险函数 看到n3wst4r,直接使用linux正则匹配,找出相关内容 Url解码,了解一下蚁剑流量 ...
- [ 赛后总结 ] CSP-J 2022
前言 今年没考好,估分 100+60+0+10=170pts ,大概能混个2=,没什么用. 这下好了,期中也砸了,已经排到全校 30 开外了,果然鱼和熊掌不可兼得,况且我双双落空,接下来怕是想搞也搞不 ...
- [OpenCV实战]30 使用OpenCV实现图像孔洞填充
在本教程中,我们将学习如何填充二值图像中的孔.考虑下图左侧的图像.假设我们想要找到一个二值掩模,它将硬币与背景分开,如下图右侧图像所示.在本教程中,包含硬币的圆形区域也将被称为前景. 请注意,硬币的边 ...
- [cocos2d-x]判断两个矩形是否有交叉区域
bool Rect::intersectsRect(const Rect& rect) const { return !( getMaxX() < rect.getMinX() || r ...
- 可持久化栈学习笔记 | 题解 P6182 [USACO10OPEN]Time Travel S
简要题意 你需要维护一个栈,有 \(n\) 个操作,支持: 给定一个 \(x\),将 \(x\) 加入栈. 将一个元素出栈. 给定一个 \(x\),将当前栈回退到 第 \(x\) 操作前. 每一次操作 ...