[AcWing303]任务安排2

有 \(N\) 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 \(N\) 个任务分成若干批,每一批包含连续的若干个任务。从时刻 \(0\) 开始,任务被分批加工,执行第 \(i\) 个任务所需的时间是 \(t[i]\) 。另外,在每批任务开始前,机器需要 \(S\) 的启动时间,故执行一批任务所需的时间是启动时间 \(S\) 加上每个任务所需时间之和。一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 \(c[i]\) 。请为机器规划一个分组方案,使得总费用最小。

\(1≤N≤3∗10^5\)

\(1≤S,Ti,Ci≤512\)

设 \(T[i]\) 为时间的前缀和 , \(C[i]\) 是系数 \(c\) 的前缀和 . 在一批任务开始对后续任务产生影响时,就先把费用累加到答案中. 这就是"费用提前计算"的思想 .

对于每一次转移, 有 \(chkmin(f[i], f[j] + (C[j] - C[i]) * T[i] + S * (C[n] - C[j]))\)

考虑到数据范围很像斜率优化 , 把式子转化为斜率优化的形式 :

\(f[j] = (S + T[i]) * C[j] - S * C[n] - T[i] * C[i] + f[i]\)

发现斜率是固定的 , 当截距最小时 \(f[i]\) 最小 . 所以要维护 \((C[j],f[j])\) 围成的下凸包 .

由于 \(f[j]\) 随 \(C[j]\) 单调递增 , \((S+T[i])\) 也是单调递增的 , 所以可以用单调队列维护 : 只保留两点间斜率 \(>=S+T[i]\) 的点 , 入队时检查有没有斜率递增

时间复杂度 \(O(n)\)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int N = 3e5 + 5; int T[N], C[N], q[N], f[N];
int n, S; int main(){
n = read(), S = read();
for(int i = 1; i <= n; ++i){
T[i] = T[i-1] + read();
C[i] = C[i-1] + read();
}
int l = 1, r = 1;
q[1] = 0; // 把0入队是因为j取0是合法的.
for(int i = 1; i <= n; ++i){
while(l < r && ((f[q[l+1]] - f[q[l]]) <= (S + T[i]) * (C[q[l+1]] - C[q[l]]))) l++;
f[i] = f[q[l]] - (T[i] + S) * C[q[l]] + C[i] * T[i] + S * C[n];
while(l < r && ((f[q[r]] - f[q[r-1]]) * (C[q[i]] - C[q[r]]) >= (f[q[i]] - f[q[r]]) * (C[q[r]] - C[q[r-1]]))) r--;
q[++r] = i;
}
printf("%d\n", f[n]);
}

[AcWing304]任务安排3

\(1≤N≤3∗10^5 ; 0≤S,c[i]≤512 ; -512≤t[i]≤512\)

完成的时间可以为负数 , 则 \(S+T[i]\) 不再具有单调性 . 所以在单调队列中二分查找出对应的位置 , 不需要出队 , 但需要维护入队时的斜率单调性

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
#define int long long
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int N = 3e5 + 5; int f[N], q[N], T[N], C[N];
int n, S; inline int find(int L, int R, int x){
while(L < R){
int mid = (L + R) >> 1;
if((f[q[mid+1]] - f[q[mid]]) <= x * (C[q[mid+1]] - C[q[mid]])) L = mid + 1; ///
else R = mid;
}
return L;
} signed main(){
n = read(), S = read();
for(int i = 1; i <= n; ++i){
T[i] = T[i-1] + read();
C[i] = C[i-1] + read();
}
int l = 1, r = 1;
for(int i = 1; i <= n; ++i){
int p = find(l, r, S + T[i]);
f[i] = f[q[p]] - (S + T[i]) * C[q[p]] + S * C[n] + T[i] * C[i];
while(l < r && ((f[q[r]] - f[q[r-1]]) * (C[i] - C[q[r]]) >= (f[i] - f[q[r]]) * (C[q[r]] - C[q[r-1]]))) r--;
q[++r] = i;
}
printf("%lld\n", f[n]);
}

[AcWing303/304]任务安排2/3的更多相关文章

  1. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  2. Beta版本冲刺计划及安排

    经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会.Beta阶段的冲刺时间为期七天,安排在2016.12. ...

  3. C语言 活动安排问题之二

    有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...

  4. C语言 活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...

  5. hdu 2037简单贪心--活动安排问题

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  6. 项目安排(离散化+DP)

    题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的 ...

  7. 1Z0-053 争议题目解析304

    1Z0-053 争议题目解析304 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 304.What privileges must be granted to allow an a ...

  8. [HTTP Protocol] 200 OK (from cache)和304 Not Modified

    含义 200 OK (from cache)直接从缓存中获取的内容并未请求服务器 304 Not Modified 请求服务器并和服务器比较 If-Modified-Since,若文件未改变,服务器返 ...

  9. 扼杀 304,Cache-Control: immutable

    随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页.这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来 ...

随机推荐

  1. Verilog求余

    在实现三角函数时,考虑到函数的周期性,综量(自变量)需对周期做求余运算. 假设函数周期为T = 2^N,那么求余运算就是直接取该数的低N位,即: 以M位正数为例(符号位为0),reg [M-1:0] ...

  2. off(events,[selector],[fn]) 在选择元素上移除一个或多个事件的事件处理函数。

    off(events,[selector],[fn]) 概述 在选择元素上移除一个或多个事件的事件处理函数. off() 方法移除用.on()绑定的事件处理程序.有关详细信息,请参阅该网页上deleg ...

  3. ansible-playbook 显示命令返回结果

    --- - hosts: test gather_facts: F #开启debug vars: war: "ps -ef | grep tomcat | grep -v grep | aw ...

  4. SpringBoot+Mybatis-Plus两种分页方法

    用到的依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus ...

  5. 使用ice-plugin-fusion给icedesign的模板加个主题(theme)

    最近一直处于半失业状态,好多年没有更新对前端的理解了,闲来看看前端技术的发展.因为一直是个草台班子,身兼多职东看看西看看,一直没太搞清楚iceworks.ant design, fusion等等一堆阿 ...

  6. mybatis-puls 字段为null时候的更新问题

    在mybatis-puls重设置的全局更新策略 为null的字段忽略更新.但是在某些业务需求下面,可能需要某些字段更新为null值.那么改如何设置 1, 在你的实体属性上面单独添加需要更新nu l l ...

  7. 来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的

    介绍临时表之前,我们首先来看这么一句语句: CREATE TABLE `words` ( `id` ) NOT NULL AUTO_INCREMENT, `word` ) DEFAULT NULL, ...

  8. vue 无法覆盖vant的UI组件的样式

    vue 无法覆盖vant的UI组件的样式 有时候UI组件提供的默认的样式不能满足项目的需要,就需要我们对它的样式进行修改,但是发现加了scoped后修改的样式不起作用. 解决方法: 使用深度选择器,将 ...

  9. cache magic对pms模块的cache访问模式分析结果

    其中43.184的命中率只有不到70%,是要分析的对象:3.189是命中率98%左右,是做参考的对象. 基本统计:可以知道43.184的update和delete操作占总操作的比例要比3.189打不少 ...

  10. Flume-事务与传输流程

    一.Flume 事务 流程图 Put 事务流程 doPut:将批数据先写入临时缓冲区 putList doCommit:检查 channel 内存队列是否足够合并 doRollback:channel ...