考虑每批任务对后面任务都有贡献, 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图形化界面设计——布局管理器之BorderLayout(边界布局)

    边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次相应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENT ...

  2. HDU 1757 A Simple Math Problem(矩阵高速幂)

    题目地址:HDU 1757 最终会构造矩阵了.事实上也不难,仅仅怪自己笨..= =! f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 ...

  3. 演示如何通过 web api 上传文件MVC40

    演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...

  4. 【最大流】【HDU3572】Task Schedule

    题意: 有N个事件,M台机器.事件有开始时间,持续时间,要在结束时间之前完成,问是否能完成所有事件? 非自己思考出来的 建图:把每个任务和每一天都看做一个点,添加源点和汇点.源点与每个任务之间连一条边 ...

  5. JavaScript Set Cursor Style

    <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <titl ...

  6. 几个Python oj的网站

    http://www.rqnoj.cn/ http://www.pythontip.com/

  7. 解决IP地址被占用问题

    问题背景: 在公司一直有同事在抱怨IP地址总是被占用的问题,我决定用技术解决这个问题 解决方案: 1 最开始想在防火墙里面做IP和mac地址绑定,做了几个之后,还是有同事在说IP被占用,后来 分析了一 ...

  8. linux下socket编程-UDP

    下面是UDP的服务器的代码: /* server.c */ #include <stdio.h> #include <string.h> #include <netine ...

  9. 网站建设之Django搭建与配置

    总是忘记一些问题解决的细节,终于发现做笔记的必要了.一步一步慢慢写,慢慢积累吧.从开始接触计算机,从硬件到系统到软件,遇到的问题真心不算少了,都记下来的话也得有本书厚了. Linux Version: ...

  10. django随笔说明

    最近学习了vamei的快速Python教程,想着语法学了不用就要忘记,总要拿点东西来练练手,然后又开始学习Django,也算是顺势而为吧. 现在学Django,是跟着教程djangobook学的,内容 ...