题解

转移方程与我的上一篇题解一样 : $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. 经典算法 KMP算法详解

    内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...

  2. node使用MySQL数据库

    内容: 1.node连接数据库 2.数据库常用操作 3.数据库实例 - 用户注册.登陆 1.node连接数据库 (1)下载mysql模块 (2)使用mysql模块连接数据库 let db=mysql. ...

  3. linux虚拟机Ubuntu命令配置

    # netstat -ntl  # 查看端口号,改成 0.0.0.0才能进行远程访问 # sudo service redis-server restart  # 修改后需要重启服务 python2和 ...

  4. zk-systemd

    [Unit] Description=auto run zk server After=network.target [Service] Type=simple Environment=ZHOME=/ ...

  5. Java-IntegerCache

    Integer类里面有一个私有的静态内部类IntegerCache类加载时,有一段静态块代码,如下 static final int low = -128; static final int high ...

  6. OpenACC 书上的范例代码(Jacobi 迭代),part 2

    ▶ 使用Jacobi 迭代求泊松方程的数值解 ● 首次使用 OpenACC 进行加速,使用动态数组,去掉了误差控制 #include <stdio.h> #include <stdl ...

  7. Amazon AWS S3 操作手册

    Install the SDK The recommended way to use the AWS SDK for Java in your project is to consume it fro ...

  8. leetcode496

    public class Solution { public int[] NextGreaterElement(int[] findNums, int[] nums) { var list = new ...

  9. as3 根据鼠标移动方向

    gz 为一个影片 import flash.display.Sprite; stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove ...

  10. c++ static成员

    static 成员通常不能在类的定义体重初始化 有一种例外,const static成员可以在定义体内初始化,并且可以用于构造函数 将函数声明为const表示该函数不能修改其所属的对象