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划分 解题报告的更多相关文章

  1. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  2. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

     http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...

  3. 解题报告 之 HDU5303 Delicious Apples

    解题报告 之 HDU5303 Delicious Apples Description There are n apple trees planted along a cyclic road, whi ...

  4. CF598: div3解题报告

    CF598:div3解题报告 A: Payment Without Change 思路: 按题意模拟即可. 代码: #include<bits/stdc++.h> using namesp ...

  5. 【九度OJ】题目1078:二叉树遍历 解题报告

    [九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ...

  6. 【LeetCode】886. Possible Bipartition 解题报告(Python)

    [LeetCode]886. Possible Bipartition 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...

  7. 【LeetCode】785. Is Graph Bipartite? 解题报告(Python)

    [LeetCode]785. Is Graph Bipartite? 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu. ...

  8. 【LeetCode】813. Largest Sum of Averages 解题报告(Python)

    [LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  9. 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)

    [剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  10. 【LeetCode】306. Additive Number 解题报告(Python)

    [LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...

随机推荐

  1. Windows11安装Hadoop3.3.2

    Windows11安装Hadoop3.3.2 JDK 安装 Hadoop的Java版本https://cwiki.apache.org/confluence/display/HADOOP/Hadoop ...

  2. win10下载jdk并配置环境变量

    win10下载jdk并配置环境变量 1. jdk下载 下载官网:Java SE开发套件15.0.2 2. jdk安装 一直点下一步就可以 3. 环境变量 配置 右键我的电脑--属性--高级系统设置-- ...

  3. kafka消费者3种分配策略

    0.10.2.1 版本的Kafka 有两种分配策略,由消费者测的参数partition.assignment.strategy来控制. RoundRobinAssignor分配策略 RangeAssi ...

  4. NOIP2015 pj

    达成成就!--尝试不看题解的情况下用cpp打完了一套NOIP pj 题目全部在luogu上-- P2669 金币 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第 ...

  5. python机器学习——KNN(K近邻算法)

    背景与原理: KNN算法其实是逻辑最简单的分类算法--我们认为一个数据的类型是由与其最接近的数据决定的,而"接近"实际上就是我们度量两个数据点之间的距离,如果我们把一组数据看做一个 ...

  6. python 深拷贝及浅拷贝区别

    深拷贝及浅拷贝区别 浅拷贝copy: 可变类型:(列表,字典,集合)copy函数对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象 不可变类型:(数字,字符 ...

  7. Java中double保留2位小数(精度丢失)的两种方式

    Java中double保留2位小数(精度丢失)的两种方式 在我们日常开发中,使用double数据类型进行计算,偶尔会出现精度丢失的情况,例如实际结果是0.75,就可能出现0.7500000000000 ...

  8. create-react-app react 使用dll抽离公共库,大幅缩减项目体积,及项目打包速度

    1.安装依赖(clean-webpack-plugin.add-asset-html-webpack-plugin.webpack-cli) yarn add clean-webpack-plugin ...

  9. suse 关闭 图形界面

    图形界面 /etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target ln -s /usr/li ...

  10. 关于group by的一个问题

    项目场景: 有时候,遇到数据库重复数据,需要将数据进行分组,并取出其中一条来展示,这时就需要用到group by语句.但是,如果mysql是高版本,当执行group by时,select的字段不属于g ...