CSP-S划分 解题报告
n <= 10
爆搜即可
n <= 50
什么乱搞
n <= 400
有一个 \(n^3\) 的 dp
设 dp[i][j] 表示最后一段为 j+1~i 时的最小值
直接三层循环转移即可
dp[1][0] = 0;
for(int i = 1;i <= n;i ++)
{
    dp[i][0] = qi[i] * qi[i];
    for(int j = 1;j < i;j ++)
        for(int k = 0;k < j;k ++)
        {
            if(qi[i] - qi[j] >= qi[j] - qi[k]) dp[i][j] = min(dp[i][j], dp[j][k] + (qi[i] - qi[j]) * (qi[i] - qi[j]));
        }
}
这里 qi 数组为前缀和
n <= 5000
通过大胆的打表我们发现,这个玩意在 j 最大,k 最大且合法时取到最小值
然后我们对于每个 j ,在转移时额外把 k 记录到 l 数组中,可以把 k 的循环优化掉,变成 \(n^2\) 。
dp[0] = 0;
for(int i = 1;i <= n;i ++)
{
    for(int j = i - 1;j >= 0;j --)
    {
        if(qi[i] - qi[j] >= qi[j] - qi[l[j]])
        {
            dp[i] = dp[j] + (qi[i] - qi[j]) * (qi[i] - qi[j]);
            l[i] = j;
            break;
        }
    }
}
n <= 500000
把要求的式子变变形,发现:
\(qi[i] >= qi[j] * 2 - qi[l[j]]\)
由于qi[i]一直在增大,所以当新加入的 j 的 \(qi[j] * 2 - qi[l[j]]\) 比之前的要小的话,后面的数只会从 j 转移,不会从之前的数转移。
所以可能被转移的,是一个 \(qi[j] * 2 - qi[l[j]]\) 的序列。
这不一眼单调队列
然后搞成了 \(O(n)\)
dp[0] = 0;
q.push_back(0);
for(int i = 1;i <= n;i ++)
{
    int back = -1;
    while(!q.empty() && qi[i] >= 2 * qi[q.front()] - qi[l[q.front()]]) back = q.front(), q.pop_front();
    if(back != -1) q.push_front(back);
    int j = q.front();
    dp[i] = dp[j] + (qi[i] - qi[j]) * (qi[i] - qi[j]);
    l[i] = j;
    while(!q.empty() && 2 * qi[i] - qi[l[i]] <= 2 * qi[q.back()] - qi[l[q.back()]]) q.pop_back();
    q.push_back(i);
}
算法复杂度已经正确了,但这道题出题人硬是要搞一个高精。如果用__int128转移那么1G空间都不够你用的。
所以就这样吧
CSP-S划分 解题报告的更多相关文章
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
		本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ... 
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
		http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ... 
- 解题报告 之 HDU5303 Delicious Apples
		解题报告 之 HDU5303 Delicious Apples Description There are n apple trees planted along a cyclic road, whi ... 
- CF598: div3解题报告
		CF598:div3解题报告 A: Payment Without Change 思路: 按题意模拟即可. 代码: #include<bits/stdc++.h> using namesp ... 
- 【九度OJ】题目1078:二叉树遍历 解题报告
		[九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ... 
- 【LeetCode】886. Possible Bipartition 解题报告(Python)
		[LeetCode]886. Possible Bipartition 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ... 
- 【LeetCode】785. Is Graph Bipartite? 解题报告(Python)
		[LeetCode]785. Is Graph Bipartite? 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu. ... 
- 【LeetCode】813. Largest Sum of Averages 解题报告(Python)
		[LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ... 
- 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)
		[剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ... 
- 【LeetCode】306. Additive Number 解题报告(Python)
		[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ... 
随机推荐
- bootstrap-select使用、relation-graph使用
			bootstrap-select 这里要实现的是带有搜索功能的select框, bootstrap 官网没有可以直接拿来用的.如下是官网给出的解释,带搜索功能的select需要自定义. 在网上找到了有 ... 
- c++实现单链表及常用方法实现
			来自https://blog.csdn.net/h294455907/article/details/80223345 这篇博客,做了一点小改动,用一个cpp实现的 #include<iostr ... 
- 安装S32 Design Studio及简单操作
			安装S32 Design Studio及简单操作 说明:安装所需要的安装包均在此文件中,安装流程及基本操作按照入门手册PDF进行即可,以下着重记录所学基本操作流程,安装流程省略 安装: 安装流程 按照 ... 
- 医学分割 不确定性 2019 MICCAI
			z今天分享一篇发表在MICCAI 2019上的论文: Uncertainty-aware Self-ensembling Model for Semi-supervised 3D Left Atriu ... 
- Day09-参数+递归
			参数+递归 一.命令行传参 有时候你希望运行一个程序时候再传递给它消息.这要靠传递命令行参数给main()函数实现 public class CommandLine{ public static vo ... 
- FATAL   Exited too quickly (process log may have details)的解决方案
			作为一个混混的开发,不会啥容器操作.所以一般都是用supervisor来管理一些运行的进程 用了一段时间还是比较好用的,这个软件也是用的Python开发. 但在使用的过程中,status时会出现 FA ... 
- 入库大文件csv文件
			LOAD DATA LOCAL INFILE 'D:\\ss\\chongzhi\\T_RORD.csv' INTO TABLE cz_T_RECHARGE_SET_RECORDFIELDS TERM ... 
- this和箭头函数的this
			https://www.cnblogs.com/lfri/p/11872696.html https://www.ruanyifeng.com/blog/2018/06/javascript-this ... 
- prometheus 配置数据保留7天时间storage.tsdb.retention.time
			1.修改配置如下: 默认24h添加配置:retention: 168h 
- Java的由来
			Java 发展史 1.1.起源 20 世纪 90 年代,单片式计算机系统诞生,单片式计算机系统不仅廉价,而且功能强大,使用它 可以大幅度提升消费性电子产品的智能化程度. SUN 公司为了抢占市场先机, ... 
