题解

转移方程与我的上一篇题解一样 : $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. express处理跨域问题,中间件 CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 1.不用中间件的话可以这样写: app.all('*', func ...

  2. 49. jdk-6u45-linux-i586.bin安装步骤

    # chmod u+x ./jdk-6u45-linux-i586.bin 1.# ./jdk-6u45-linux-i586.bin 在按提示输入yes后,jdk被解压到./jdk1.6.0_45目 ...

  3. php iconv 函数

    原型: $txtContent = iconv("utf-8",'GBK',$txtContent); 特殊参数:iconv("UTF-8","GB2 ...

  4. windows7安装node

    一.在官网下载node 二.按照提示进行安装 三.安装好的目录结构 四.测试是否安装好了node 首先按快捷键win+r,在运行窗口输入cmd,调出命令提示窗口,在命令提示窗口中输入path查看nod ...

  5. autolayout UILabel 设置最大宽度

    label1.preferredMaxLayoutWidth = 100: label1.numberOfLines = 0; //自适应行数

  6. centos sendmail 启动慢

    from:http://www.cnblogs.com/kerrycode/p/4717498.html 在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢, ...

  7. Python中的操作符重载

    运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果.     类可以重载python的操作符 操作符重载使我们的对 ...

  8. Mysql binlog二进制日志

    Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的实际原sql语句都会被记录在binlog中. 优点:不需要记录每一 ...

  9. Session的作用和使用场景

    1.session何时被创建? 客户首次访问服务器时,回话session对象被创建并分配一个唯一的Id,同时id号发送到客户端,并存入cookie,使得客户端session对象和服务器端一致. 2.如 ...

  10. Hibernate 中的锁( locking )

    业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数 ...