题解

转移方程与我的上一篇题解一样 : $S\times sumC_j  + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$。

分离成:$S\times sumC_j  + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$

不同的是, 时间可能为 负数(出题人解释:不要把时间看的这么狭义。

所以$sumT_i$不是递增。

所以我们不能在队首弹出斜率比 $sumT_i$小的数, 只能用一个数据结构来维护并查询, 我当然是用了好玩的set

但是队尾还是需要维护下凸壳。

有一个坑点:用叉积来弹出队尾可能爆longlong, 开double可以过QAQ

代码

 #include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#define rd read()
#define rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define per(i,a,b) for( int i = (a); i >= (b); --i)
using namespace std;
#define ll long long
typedef pair<double, ll>P; const ll N = 1e6;
const ll inf = 1e18;
const double eps = 1e-; ll S, sumT[N], sumC[N], q[N], n;
ll f[N]; set<P>st; ll read() {
ll X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} ll cross(ll a, ll b, ll c) { //叉积
ll ax = sumC[a], bx = sumC[b], cx = sumC[c];
ll ay = f[a], by = f[b], cy = f[c];
ll x = bx - ax, y = by - ay, xx = cx - ax, yy = cy - ay;
if(fabs(1LL * x * yy - 1LL * xx * y) < eps) return ;
return (long double)x * yy > (long double)xx * y;
} double calc(ll a, ll b) {
ll ax = sumC[a], bx = sumC[b];
ll ay = f[a], by = f[b];
if(bx - ax == ) return by > ay ? inf : -inf;
else return 1.0 * (by - ay) / (bx - ax);
} int main()
{
n = rd; S = rd;
rep(i, , n) {
ll t = rd, c = rd;
sumT[i] = sumT[i - ] + t;
sumC[i] = sumC[i - ] + c;
}
ll l = , r = ;
q[] = f[] = ;
set<P>::iterator it;
st.insert(P(-inf, ));
rep(i, , n) {
double k = S + sumT[i];
P fd = P(k, );
it = st.lower_bound(fd);//查找最小的斜率比sumT[i]大的
it--;
ll p = (*it).second;
f[i] = f[p] + 1LL * sumT[i] * (sumC[i] - sumC[p]) + 1LL * S * (sumC[n] - sumC[p]);
while(l < r && cross(q[r - ], q[r], i) == ) {
st.erase(P(calc(q[r - ], q[r]), q[r]));
r--;
}
q[++r] = i;
st.insert(P(calc(q[r - ], q[r]), i));
}
printf("%lld\n", f[n]);
fclose(stdin); fclose(stdout);
}

BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp的更多相关文章

  1. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  2. BZOJ 2726: [SDOI2012]任务安排 斜率优化 + 凸壳二分 + 卡精

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  3. [SDOI2012]任务安排 - 斜率优化dp

    虽然以前学过斜率优化dp但是忘得和没学过一样了.就当是重新学了. 题意很简单(反人类),利用费用提前的思想,考虑这一次决策对当前以及对未来的贡献,设 \(f_i\) 为做完前 \(i\) 个任务的贡献 ...

  4. bzoj 2726 任务安排 斜率优化DP

    这个题目中 斜率优化DP相当于存在一个 y = kx + z 然后给定 n 个对点 (x,y)  然后给你一个k, 要求你维护出这个z最小是多少. 那么对于给定的点来说 我们可以维护出一个下凸壳,因为 ...

  5. BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

    考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关 ...

  6. BZOJ 1010: 玩具装箱toy (斜率优化dp)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  7. BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...

  8. BZOJ 3675 APIO2014 序列切割 斜率优化DP

    题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...

  9. 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治

    [BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...

随机推荐

  1. 收集的一些python基础教学博客

    =======python3学习链接======= Python 3 教程:http://www.runoob.com/python3/python3-tutorial.html 深入python3: ...

  2. convolution-卷积神经网络

    训练mnist数据集 结构组成: input_image --> convolution1 --> pool1 --> convolution2 --> pool2 --> ...

  3. OpenACC 计算构建内的自定义函数

    ▶ 使用 routine 构件创建的自定义函数,在并行调用上的差别 ● 代码,自定义一个 sqab 函数,使用内建函数 fabsf 和 sqrtf 计算一个矩阵所有元素绝对值的平方根 #include ...

  4. C# 生成word文档(NPOI)

    using NPOI.XWPF.UserModel XWPFDocument doc = new XWPFDocument(); //创建新的word文档 XWPFParagraph p1 = doc ...

  5. 1.mybatis实战教程mybatis in action之一开发环境搭建

    转自:https://www.cnblogs.com/shanheyongmu/p/5652471.html 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框 ...

  6. PCI Simple Communications Controller

    PCI Simple Communications Controller Intel Management Engine Interface (MEI)

  7. UI5-文档-2.5-开发混合Web容器

    开发混合Web容器 您可以将移动应用程序开发为混合应用程序,该混合应用程序由本机应用程序包装程序(例如PhoneGap)和HTML查看器组成,用于在用户界面上显示内容. 混合应用程序的优点是可以在应用 ...

  8. spring cloud DashBoard

    1 依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  9. 2018.8.14-C#复习笔记总

    using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System ...

  10. mtr 命令详解

    一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,tracert可以用来跟踪路由,在Linux中有一个更好的网络连通性判断工具,它可以结合ping ns ...