考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关的量只有t = dp(j) - F(i) * T(j) , 我们要最小化它. dp(j)->y, T(j)->x, 那么y = F(i) * x + t, 就是给一些点和一个斜率...然后最小化截距, 显然维护下凸包就可以了. 然后因为无比坑爹的出题人....时间可以为负数, 所以要用平衡树维护(假如时间为非负数用单调队列就行了)....或者cdq分治. O(N log N)平衡树维护大家都应该会...cdq分治就是对于[l, r), m=(l+r)/2, 处理[m, r)的dp值对[l, m)dp值的贡献(这道题是从后往前dp). 具体就是暴力建[m, r)的凸包, 然后[l, m)的按斜率排序, 依次询问. 预处理一下, 时间复杂度就是O(N log N)了, 空间复杂度是O(N).

-------------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 300009;
 
int N, S, V[maxn], q[maxn], stk[maxn], T[maxn], F[maxn];
ll dp[maxn];
 
void Init() {
scanf("%d%d", &N, &S);
for(int i = 0; i < N; i++) {
scanf("%d%d", T + i, F + i);
q[i] = N - i - 1;
}
T[N] = F[N] = 0;
for(int i = N; i--; )
T[i] += T[i + 1], F[i] += F[i + 1];
}
 
bool chk(int a, int b, int c) {
int xl = T[b] - T[a], xr = T[c] - T[b];
ll yl = dp[b] - dp[a], yr = dp[c] - dp[b];
return ((xl < 0) ^ (xr < 0)) ? yl * xr <= yr * xl : yl * xr >= yr * xl;
}
 
bool Jud(int a, int b, int k) {
ll x = T[b] - T[a], y = dp[b] - dp[a];
return x < 0 ? y > x * k : y < x * k;
}
 
ll calc(int x, int y) {
return dp[y] + ll(F[x]) * (T[x] - T[y] + S);
}
 
// [l, r)
void cdq(int l, int r) {
if(l + 1 == r) return;
int m = (l + r) >> 1;
int ql = l, qr = m;
for(int i = l; i < r; i++)
q[i] < m ? V[ql++] = q[i] : V[qr++] = q[i];
for(int i = l; i < r; i++) q[i] = V[i];
cdq(m, r);
int h = 0, t = -1;
for(int i = m; i < r; i++) {
while(t > 0 && chk(stk[t - 1], stk[t], q[i])) t--;
stk[++t] = q[i];
}
for(int i = l; i < m; i++) {
while(h < t && Jud(stk[h], stk[h + 1], F[q[i]])) h++;
dp[q[i]] = min(dp[q[i]], calc(q[i], stk[h]));
}
cdq(l, m);
ql = l, qr = m;
for(int i = l; i < r; i++) if(ql >= m) {
V[i] = q[qr++];
} else if(qr >= r) {
V[i] = q[ql++];
} else
V[i] = T[q[ql]] < T[q[qr]] ? q[ql++] : q[qr++];
for(int i = l; i < r; i++) q[i] = V[i];
}
 
void Work() {
for(int i = 0; i < N; i++)
dp[i] = ll(F[i]) * (T[i] + S);
cdq(0, N);
printf("%lld\n", dp[0]);
}
 
int main() {
Init();
Work();
return 0;
}

-------------------------------------------------------------------------------------------------

2726: [SDOI2012]任务安排

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 660  Solved: 171
[Submit][Status][Discuss]

Description

机器上有N个需要处理的任务,它们构成了一个序列。这些任务被标号为1到N,因此序列的排列为1,2,3...N。这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和。注意,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。

Input

第一行两个整数,N,S。
接下来N行每行两个整数,Ti,Fi。

Output

一个整数,为所求的答案。

Sample Input

5 1
1 3
3 2
4 3
2 3
1 4

Sample Output

153

HINT

Source

BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )的更多相关文章

  1. bzoj 2726: [SDOI2012]任务安排【cdq+斜率优化】

    cdq复健.jpg 首先列个n方递推,设sf是f的前缀和,st是t的前缀和: \[ f[i]=min(f[j]+s*(sf[n]-sf[j])+st[i]*(sf[i]-sf[j])) \] 然后移项 ...

  2. BZOJ.2726.[SDOI2012]任务安排(DP 斜率优化)

    题目链接 数据范围在这:https://lydsy.com/JudgeOnline/wttl/thread.php?tid=613, 另外是\(n\leq3\times10^5\). 用\(t_i\) ...

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

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

  4. bzoj 2726 [SDOI2012]任务安排(斜率DP+CDQ分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2726 [题意] 将n个任务划分成若干个块,每一组Mi任务花费代价(T+sigma{ t ...

  5. bzoj 2726: [SDOI2012]任务安排

    Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...

  6. BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp

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

  7. BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治

    2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...

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

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

  9. bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...

随机推荐

  1. Java反射及依赖注入简单模拟

    一.编写Dao类 ? 1 2 3 4 5 6 7 8 9 10 11 package cn.com.songjy.annotation;   import java.util.Date;   publ ...

  2. 具体解释HTML中的window对象和document对象

    Window -- 代表浏览器中一个打开的窗体: 对象属性 window //窗体自身 window.self //引用本窗户window=window.self window.name //为窗体命 ...

  3. 第003篇 深入体验C#项目开发(二)

    下半本的5个项目也看完了,还是跳着看,只看大概!        第6章 企业交互系统            作者入职一年,开始带新的2个实习生的项目!一个外资企业内部的OA交互系统,这次又是一个基于w ...

  4. 关于常用meta的总结

    入行也半年了,无数次的想过写博客也无数次的想过第一篇会写什么,一直没有落实.今天心血来潮把博客开了,那就写点东西吧.第一篇就写一写看似简单但又经常不注意到的meta标签吧.(博主经验尚浅,有许多理解不 ...

  5. UVA 1001 Say Cheese

    题意: 一只母老鼠想要找到她的玩具,而玩具就丢在一个广阔的3维空间上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s.还有一种方法,就是靠钻洞,洞是球形的 ...

  6. Android应用开发基本流程及测试运行

    (1)Android App工程项目的创建 File—New—New Project 设置项目.程序包的名称 设置项目名称为MyDiary,程序包名为org.socrates.mydiary.acti ...

  7. Oracle触发器Trigger2行级

    create table trigger_t2( id int, name ), age int ); /* --创建一个before update的触发器-控制每一行,行级 --只有行级的才会有:n ...

  8. iOS开发那些事儿(四)the dark arts of the Objective-C runtime

    一."Black Magic":Method Swizzling 利用 Runtime 特性把一个方法的实现与另一个方法的实现进行替换,也可以用runtime的四维理解——修改Di ...

  9. 持续更新visual studio 命令、快捷键(原创)

    “格式化代码” Ctrl + E + D “注释” Ctrl + E + C “取消注释” Ctrl + E + U “点代替空白”   编辑-高级-显示空白 快捷键 Ctrl + E + S

  10. 自定义TabHost,TabWidget样式

    先看效果: 京东商城底部菜单栏 新浪微博底部菜单栏 本次学习效果图: