题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line)

题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 DP 状态。

设两端区间\(Q_i\)和\(Q_j\)满足\(Q_i \subseteq Q_j\),那么显然\(Q_j\)要么单独一组,要么就和\(Q_i\)一组。

证明使用反证法,设\(Q_j\)与其他某些一组,那么我把\(Q_j\)放入\(Q_i\)那一组,显然两组的答案都不会变少。

因此我们认为\(Q_j\)这一段无用了,当且仅当它单独一组时我们再计算它的贡献\(t_j-s_j\)。剩下的区间显然满足性质:左端点与右端点分别递增,于是就可以 DP 了。设\(f_{i,j}\)为前\(i\)个区间分成了\(j\)组后最大的收获,状态转移方程:

\[f_{i,j}==\min_{k<i,t_{k+1}>s_i}{f_{k,j-1}+t_{k+1}-s_i}
\]

正确性来源于这些区间的并就等于\([s_i,t_{k+1}]\),使用单调队列优化可以实现\(\Theta(n^2)\)。最后枚举一下我选几个之前不要的那种大区间,从大到小枚举,就可以了。

然后就不得不提这题实现的诸多细节了,因为我们要保证答案更新时一定是从合法的值更新,所以\(f\)数组的初值统统要设为负无穷,可以避免非常多的细节,还有f[0][0]=0那一句其实是最妙的,能够解决很多初值的问题。

memset(f, -127 / 3, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= k; i++)
{
q[head = tail = 1] = i - 1;
for (int j = i; j <= cnt; j++)
{
while (t[nw[q[head] + 1]] <= s[nw[j]] && head <= tail)
{
head++;
}
f[j][i] = f[q[head]][i - 1] + t[nw[q[head] + 1]] - s[nw[j]];
while (head <= tail && f[j][i - 1] + t[nw[j + 1]] >= f[q[tail]][i - 1] + t[nw[q[tail] + 1]])
{
tail--;
}
q[++tail] = j;
}
}
LL ans = 0, now = 0;
for (int i = 0; i <= k; i++)
{
if (f[cnt][k - i])
ans = max(ans, now + f[cnt][k - i]);
if (hp.empty()) break;
now += hp.top(); hp.pop();
}

#10470. 「2020-10-02 提高模拟赛」流水线 (line)的更多相关文章

  1. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  2. 「2019-8-13提高模拟赛」树 (tree)

    传送门 Description 你有一个 \(n\)个点的树,第 \(i\)个点的父亲是\(p_i\).每个点有一个权值 \(t_i\) 和一个颜色黑或者白.所有点一开始都是白色. 你要进行 \(m\ ...

  3. 「2019-8-11提高模拟赛」女装盛宴 (flag)

    传送门 Solution  基环树+倍增+双指针 第一次因为#define int long long而玄学RE 为什么标程都不用开\(long long\)啊 Code  /*玄学RE 看来defi ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. JZOJ 2020.10.7 提高B组反思

    JZOJ 2020.10.7 提高B组反思 T1 比较简单的一道题 跑\(k\)遍\(SPFA\) 然后全排列顺序枚举求解 TLE 60 双向存边数组没开两倍-- T2 搞出分母 分子不会求 \(n^ ...

  8. JZOJ 2020.10.6 提高B组反思

    JZOJ 2020.10.6 提高B组反思 T1 NYG的动态数点 最简单的一题 很容易想到\(O(n)\)的做法 枚举最小的那个数,即\(a_k\) 然后向左和向右扩展 然后可以直接从右端点+1继续 ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

随机推荐

  1. SpringBoot 01 hello world 01

    hello world项目结构: pom中配置的依赖相当于spring boot的可安装插件,需要下载的依赖直接在里边配置. 目前用到的每个注解: 1.主程序中 @SpringBootApplicat ...

  2. python flask1

    以这个服务端代码为例,简单了解一下flask的运用. 1.app = Flask(__name__)记住就好了 2.@app.route("/")记住就好了:注意括号里的是调用这个 ...

  3. Java:LinkedHashMap类小记

    Java:LinkedHashMap类小记 对 Java 中的 LinkedHashMap类,做一个微不足道的小小小小记 概述 public class LinkedHashMap<K,V> ...

  4. Noip模拟78 2021.10.16

    这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...

  5. numpy中的nan和常用方法

    1.数组的拼接 import numpy as np t1 = np.array([[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]) t2 = np.array([ ...

  6. 15个问题自查你真的了解java编译优化吗?

    摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...

  7. 第01课 OpenGL窗口(3)

    接下来的代码段创建我们的OpenGL窗口.我花了很多时间来做决定是否创建固定的全屏模式这样不需要许多额外的代码,还是创建一个容易定制的友好的窗口但需要更多的代码.当然最后我选择了后者.我经常在EMai ...

  8. 编译安装mysql和zabbix,xtrabackup数据库备份

    xtrabackup参考文章 https://www.cnblogs.com/linuxk/p/9372990.html 下载5.7的mysql 社区版包 https://cdn.mysql.com/ ...

  9. spring security之 默认登录页源码跟踪

    spring security之 默认登录页源码跟踪 ​ 2021年的最后2个月,立个flag,要把Spring Security和Spring Security OAuth2的应用及主流程源码研究透 ...

  10. k8s入坑之路(7)kubernetes设计精髓List/Watch机制和Informer模块详解

    1.list-watch是什么 List-watch 是 K8S 统一的异步消息处理机制,保证了消息的实时性,可靠性,顺序性,性能等等,为声明式风格的API 奠定了良好的基础,它是优雅的通信方式,是 ...