JZOJ 3479. 工作安排
\(\text{solution}\)
比较显然的 \(dp\)
顺序既然无所谓,那为了方便处理贡献,就先排个序
然后设 \(f_i\) 表示分到前 \(i\) 个的最小工资
则 \(f_i=C+f_j+{(t_i-t_{j+1})}^2=C+f_j+{t_i}^2+{t_{j+1}}^2-2 \times t_i \times t_{j+1}\)
斜率优化下
若有 \(k<j\),\(j\) 比 \(k\) 优
那么 \(((f_j+{t_{j+1}}^2)-(f_k+{t_{k+1}}^2))/(t_{j+1}-t_{k+1})<2\times t_i\)
单调队列维护下凸壳即可
#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 1e6 + 5;
const LL INF = 1e18;
LL f[N], t[N];
int n, k, C, Q[N];
inline void read(LL &x)
{
x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
}
inline double slope(int j, int k)
{
return 1.0 * (f[j] + t[j + 1] * t[j + 1] - f[k] - t[k + 1] * t[k + 1]) / (t[j + 1] - t[k + 1]);
}
int main()
{
scanf("%d%d%d", &n, &k, &C);
for(int i = 1; i <= n; i++) read(t[i]);
sort(t + 1, t + n + 1);
int head = 1, tail = 1;
for(int i = 1; i < k; i++) f[i] = INF;
for(int i = k; i <= n; i++)
{
while (head < tail && slope(Q[head + 1], Q[head]) < t[i] * 2) head++;
f[i] = C + f[Q[head]] + (t[i] - t[Q[head] + 1]) * (t[i] - t[Q[head] + 1]);
while (head <= tail && t[Q[tail]] == t[i - k + 1])
{
if (f[i - k + 1] <= f[Q[tail]]) tail--;
else break;
}
while (head < tail && slope(i - k + 1, Q[tail]) < slope(Q[tail], Q[tail - 1])) tail--;
Q[++tail] = i - k + 1;
}
printf("%lld\n", f[n]);
}
JZOJ 3479. 工作安排的更多相关文章
- 【BZOJ】【2245】【SDOI2011】工作安排
网络流/费用流 裸题吧……直接建模就好了……所谓的“分段函数”就是吓唬你的,其实就是对于每个人分开建几条流量不同.费用不同的弧而已. 对每种产品,连S->i ,(c[i],0):对每个工作人员 ...
- lemon OA 下阶段工作安排
lemon OA 下阶段工作安排 经验总结 lemon OA系统作为一个中型的java web系统,在架构上还是有着很好地可学习的地方.但是由于经验不足,过程比较迂回.如果真的有经验的话,应该可以做到 ...
- BZOJ1572: [Usaco2009 Open]工作安排Job
1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 775 Solved: 337[Submit ...
- bzoj 2245 [SDOI2011]工作安排(最小费用最大流)
2245: [SDOI2011]工作安排 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1197 Solved: 580[Submit][Statu ...
- BZOJ 2245: [SDOI2011]工作安排( 费用流 )
费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...
- BZOJ 1572: [Usaco2009 Open]工作安排Job( 贪心 )
贪心... 按截止时间排序 , 然后从小到大考虑 . 假设当前考虑第 i 个任务 , 若目前已选工作数 < D_i , 那就选 i ; 否则 若已选工作中利润最小的比 P_i 小 , 那就去除它 ...
- 【BZOJ 1572】 1572: [Usaco2009 Open]工作安排Job(贪心+优先队列)
1572: [Usaco2009 Open]工作安排Job Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单 ...
- 1572: [Usaco2009 Open]工作安排Job
1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 814 Solved: 365[Submit ...
- 【BZOJ2245】[SDOI2011]工作安排(费用流)
[BZOJ2245][SDOI2011]工作安排(费用流) 题面 BZOJ 洛谷 题解 裸的费用流吧. 不需要拆点,只需要连边就好了,保证了\(W_j<W_{j+1}\). #include&l ...
- 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...
随机推荐
- 【基础语法规范】【函数式编程、字符串分割】BC6:输出输入的第二个整数
思路:数组or字符串split分割 一.Scala 方法1:Int数组[不行] import scala.io.StdIn object Main{ def main(args:Array[Strin ...
- [常用工具] cvat安装与使用指北
cvat是一个非常好用的标注工具,但是也是非常难以安装的标注工具,所以本文简单讲一讲如何安装与使用cvat.cvat最好在ubuntu18.04安装,windows平台安装难度很大,然后在其他平台使用 ...
- [OpenCV实战]39 在OpenCV中使用ArUco标记的增强现实
文章目录 1 什么是ArUco标记? 2 在OpenCV中生成ArUco标记 3 检测Aruco标记 4 增强现实应用 5 总结和代码 5.1 生成aruco标记 5.2 使用aruco增强现实 6 ...
- C++指针【cherno课程学习】
定义: 指针是一个整数,一种存储内存地址的数字 内存就像一条线性的线,在这条街上的每一个房子都有一个号码和地址 类似比喻成电脑,这条街上每一个房子的地址 是一个字节 我们需要能够准确找到这些地址的方法 ...
- Python简单api实现
flask 作用及简单使用 Flask的简单介绍及使用方法简介_珂鸣玉的博客-CSDN博客_flask 简单api搭建 import flask api = flask.Flask(__name__) ...
- Java学习笔记:2022年1月7日
Java学习笔记:2022年1月7日 摘要:今天的这篇笔记主要是通过讲解基本的JVM结构来理解Java中一些行为的运行机制,进而更加的深入理解Java的运行原理. 目录 Java学习笔记:2022年1 ...
- Nexus私有maven库部署和使用
原文地址:Nexus私有maven库部署和使用 - Stars-One的杂货小窝 前段圣诞节前后,Jitpack网站突然崩溃了,无法下载依赖,然后过了一个星期才解决了,好在没啥紧急的Android开发 ...
- 对 Pulsar 集群的压测与优化
前言 这段时间在做 MQ(Pulsar)相关的治理工作,其中一个部分内容关于消息队列的升级,比如: 一键创建一个测试集群. 运行一批测试用例,覆盖我们线上使用到的功能,并输出测试报告. 模拟压测,输出 ...
- 洛谷P1048 典型01背包问题
写在前面的话 蒟蒻在学习诸多图论算法之前,实际上没学过dp! 强说是学过也是只学了01背包,今天就来温习一下-- DP是啥? 动态规划(Dynamic Programming,DP)是运筹学的一个分支 ...
- 一看就会的 Anaconda 搭建 OpenCV for Python 环境(全平台通用)
前言 在学习 OpenCV 的时候,需要搭建 OpenCV 的环境并安装一些库,本文就准备了 OpenCV for Python,换而言之就是 OpenCV 的 python 的 API 接口.它拥有 ...