有感而发,遂书。
其实和sze聊了很久,但他还是退役了。恐怕他是本届里学oi时间最长的一个人吧,从小学五年级开始。我也是因为他,才开始学oi的。他因为学校的压力,不得不放弃。或许是没什么天赋。学了4年也才一个pj2=,我也才学了半年多,就是省一。只是感叹罢了。在提高机房里,我是最小的。在普及机房里我是最大的。事实上,我又何尝不羡慕呢,也许,我再早一点,只要早半年,我就可以初三进省队。或许,这是对我挥霍初二一年时光的惩罚吧。

时光荏苒,你我不再是少年。

题意分析

我们看一下弱化版,再看下标准版

我们很简单的有一个dp的造作,事实上是可以过掉第一题的

定义 \(f_i\)表示完成\(1\)至\(i\)任务所需的最少花费。

所求 \(f_n\)即为所求

为了书写方便。我们做一个前缀和 定义 c,t就像题面所说的

dp转移方程
\[
f[i]=min_{0 \le j < i}\{ f[j]+s*(c[n]-c[j])+t[i]*(c[i]-c[j])\}
\]

轻轻一跃跳入坑中

我们这里用了一种想法,就是把后面任务的启动时间算到这一次,这样就不用统计他的记录分了几批任务的状态。

运用这个dp的转移是\(O(n^2)\)的,可以过掉第一题,但是第二题还差优化。

观察了第二题。由于是一维dp自然想到了决策的单调性。推了一下大概是满足的。于是我想到了斜率优化。。。。从此跳入了坑

我们把上面的dp方程做展开有:
\[
f[j]=(t[i]+s)*c[j]+(-t[i]*c[i]+f[i]-s*c[n])
\]
我们知道,如果能斜率优化dp方程必定能变为\(y=kx+b\) 的形式

其中y=只关于j的函数,x=只关于j的函数,k=只关于i的函数,b=只关于i的函数,kx不严格单调递增。

我们的每个点就为\((c[j],f[j])\),此时,这不就是斜率优化的板子吗?开心的打上去。0pts滚粗

于是我们观察数据范围 \(|t_i| \le 2^8\)..有负的,所以我们不能维护单调队列。但是dp的决策是单调的!

那就再跳出来

那就用一个单调栈。

我们的单调队列维护了一个下图

然而k不是单增的,显然的,上凸点依然不可能成为决策点。所以我们要维护的就是一个下凸包就如下图:

再找最优决策点是可以二分来找

可以用单调栈来维护

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
typedef double db;
const int Maxn=3*1e5+11;
ll n,s,c[Maxn],t[Maxn],q[Maxn],tail,head;
ll f[Maxn];
ll read(){
    ll x=0;
    bool f=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0'){
        x=(x<<1)+(x<<3)+(ch-'0');
        ch=getchar();
    }
    if(f) return -x;
    return x;
}
ll search(ll head,ll tail,ll k){
    if(head==tail) return q[head];
    ll ans;
    while(head<=tail){
        ll mid=(head+tail)>>1;
        if((f[q[mid+1]]-f[q[mid]])>(ll)k*(c[q[mid+1]]-c[q[mid]])){
            // 维护下凸壳去第一个 slope(mid,mid+1)>k,因为下凸壳k单增
            tail=mid-1;
            ans=mid;
        }
        else head=mid+1;
    }
    return q[ans];
}
int main(){
    freopen("SDOItask.in","r",stdin);
    n=read();s=read();
    for(int i=1;i<=n;i++) t[i]=t[i-1]+read(),c[i]=c[i-1]+read();
    tail=1;head=1;
    for(int i=1;i<=n;i++){
        ll p=search(head,tail,s+t[i]);
        f[i]=f[p]+t[i]*(c[i]-c[p])+s*(c[n]-c[p]);
        while(head<tail&&(f[i]-f[q[tail]])*(ll)(c[q[tail]]-c[q[tail-1]])<=(f[q[tail]]-f[q[tail-1]])*(ll)(c[i]-c[q[tail]])) tail--;
        q[++tail]=i;
    }
    printf("%lld",f[n]);
    return 0;
}

讲真的,我不会线段树。。。

[SDOI2012] 任务安排 题解的更多相关文章

  1. 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治

    [BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...

  2. [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1580  Solved: 466[Submit][Statu ...

  3. BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

    考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关 ...

  4. [bzoj P2726] [SDOI2012]任务安排

    [bzoj P2726] [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1204 Solved: 349[Submit] ...

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

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

  6. BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分

    BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这 ...

  7. 笔记-[SDOI2012]任务安排

    笔记-[SDOI2012]任务安排 [SDOI2012]任务安排 \(f_i\) 表示分配到第 \(i\) 个任务的最小费用. 令 \(st_i=\sum_{h=1}^iT_h\),\(sc_i=\s ...

  8. [SDOI2012]任务安排 BZOJ2726 斜率优化+二分查找

    网上的题解...状态就没有一个和我一样的...这让我有些无从下手... 分析: 我们考虑,正常的斜率优化满足x(i)单调递增,k(i)单调递增,那么我们就可以只用维护一个单调队列满足对于当前的x(i) ...

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

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

随机推荐

  1. two measures precision and recall of classification

    In pattern recognition and information retrievial with binary classification , there are some measur ...

  2. MySQL复制(四)—多源(主)复制

    (一)多主复制概述 MySQL从5.7版本开启支持多主复制,所谓多主复制,是将多个主库的数据复制到一个从库中.通常用于数据仓库整合数据,比如OLTP系统为了分散业务压力,对数据库进行分库分表,当要对数 ...

  3. Go语言实现:【剑指offer】二进制中1的个数

    该题目来源于牛客网<剑指offer>专题. 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1 ...

  4. JAVA中的约瑟夫环和猴子王问题

    今天在书上(书名< java程序设计经典300例 >李源编著)看了一个有趣的问题,那就是java版的约瑟夫问题,想必大一的小伙伴们早就用c写过了吧 今天我在复习一下 首先问题是这样的n个人 ...

  5. node - MongoDB数据库

    mongod 安装配置 在Mongodb官网下载最新版本的Mongodb下载地址 下载msi的window安装包,可以装到C盘或者D盘目录下 配置 由于我是安装在D盘的环境下 D:\Program F ...

  6. numpy 介绍与使用

    一.介绍 中文文档:https://www.numpy.org.cn/ NumPy是Python语言的一个扩展包.支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.NumPy提供了与Ma ...

  7. zabbix的mysql优化后的配置文件

    zabbix的mysql数据库导致磁盘IO一直90%以上,访问卡的一逼 改了配置文件最后好了 [root@root /]# cat /etc/my.cnf [mysqld] datadir=/Data ...

  8. Chrome Vue Devtools插件安装和使用

    安装:fq后在chrome应用商店搜索 Vue Devtools并安装,安装成功后浏览器右上角有vue的图标 安装完毕后,打开含有vue框架的网站,这是vue图标会变亮,进入开发者工具,再右侧vue选 ...

  9. 【Web性能权威指南】 PDF

    Web性能权威指南.pdf 网盘:https://545c.com/file/24657411-424998805     获取码:276922

  10. ID生成器之——别人家的方案and自家的方案

    “叮咚,叮咚……”,微信提示音一声接一声,声音是那么的频繁,有妖气,待俺去看一看. 这天刚吃完午饭,打开微信,发现我们的技术讨论组里有 100 多条未读消息,心想,是不是系统出问题了?怎么消息那么频繁 ...