[NOIP2019] 划分
题目

题解
首先YY一个最简单的dp
$dp[i][j]=min(dp[j][k]+(sum[i]-sum[j])^2 (sum[i]-sum[j]>=sum[j]-sum[k])$
$dp[i][j]$表示i为终点,j为上一段起点的最小代价。
上述过程其实就是在i的左端寻找满足条件的点,然后一一计算代价并取最小值(注意这些点可能不是连续的)

但其实,我们只要取最右边的满足条件的点来更新就行了,证明见下

我们可以记一个$pre[i]$表示i点上一个区间的终点
这样我们就有了一个$O(n^2)$ dp
对于每个点i,我们从i往前扫,找到第一个满足 $(sum[i]-sum[j]>=sum[j]-sum[pre[j])$ 的点j ,则
$dp[i]=dp[j]+(sum[i]-sum[j])^2$
注意到如果一个点j满足i,那么它肯定满足i+1,
如果不满足i,也可能满足i+1
另外,对于 $sum[i]-sum[j]>=sum[j]-sum[pre[j]$
可以变形成 $sum[i]>=2*sum[j]-sum[pre[j]$
那么可以设一个$d(j)=2*sum[j]-sum[pre[j]$
我们可以用一个单调队列来维护满足条件的点
因为我们只需要最右边满足条件的点,所以每次i递增的时候,如果队头下一位也满足条件,就把队头踢掉(因为下一位肯定比队头更右)
然后用队头更新这一位的dp值
然后把这一位从队尾插入,并把前面d值大于它的点全部删除
这样就可以做到$O(n)$了
代码
这个是88分的,100分的要写高精,但正确性是有的。
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
#define N 4*(int)1e7+10
int sum[N],pre[N],q[N],dp[N],l=1,r=0;
#define val(a) (2*sum[a]-sum[pre[a]])
signed main()
{
int n,type;
cin>>n>>type;
for(int i=1;i<=n;i++)
{
int a;
scanf("%lld",&a);
sum[i]=sum[i-1]+a;
}
q[++r]=0;
for(int i=1;i<=n;i++)
{
while(l<r&&val(q[l+1])<=sum[i]) l++;
pre[i]=q[l];
dp[i]=dp[pre[i]]+(sum[i]-sum[pre[i]])*(sum[i]-sum[pre[i]]);
while(l<=r&&val(i)<=val(q[r])) r--;
q[++r]=i;
}
cout<<dp[n];
}
[NOIP2019] 划分的更多相关文章
- [LeetCode] Partition List 划分链表
Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...
- SWMM模型子汇水区划分的几种方法
子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...
- 等价类划分方法的应用(jsp)
[问题描述] 在三个文本框中输入字符串,要求均为1到6个英文字符或数字,按submit提交. [划分等价类] 条件1: 字符合法; 条件2: 输入1长度合法; 条件3: 输入2长度合法: 条件4: 输 ...
- Java上等价类划分测试的实现
利用JavaFx实现对有效等价类和无效等价类的划分: 代码: import javafx.application.Application;import javafx.event.ActionEvent ...
- ENode框架Conference案例分析系列之 - 上下文划分和领域建模
前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的 ...
- Cesium原理篇:2最长的一帧之网格划分
上一篇我们从宏观上介绍了Cesium的渲染过程,本章延续上一章的内容,详细介绍一下Cesium网格划分的一些细节,包括如下几个方面: 流程 Tile四叉树的构建 LOD 流程 首先,通过上篇的类关系描 ...
- 两种交换机配置模式,以配置基于端口划分的VLAN为例
关于交换机的配置模式,大体上可以分为两类:其一以CISCO交换机为代表的配置模式,其二以Huawei.H3C交换机为代表的配置模式.其实这两种配置模式并没有本质的不同,只是配置的命令名称和配置方式存在 ...
- tyvj1194 划分大理石
描述 有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现.其中大理石的总数不超过20000. 输入格式 有多组数据!所以可能有多行如果有0 ...
- tyvj1102 单词的划分
描述 有一个很长的由小写字母组成字符串.为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词.出于减少分析量的目的,我们希望划分出的单词数越少越好.你就是来完成这一划分工作的. ...
随机推荐
- P3756 [CQOI2017]老C的方块
题目链接 看到网格图+最优化问题,当然要想黑白染色搞网络流.不过这道题显然无法用黑白染色搞定. 仔细观察那四种图形,发现都是蓝线两边一定有两个格子,两个格子旁边一定还有且仅有一个格子.因此我们可以这么 ...
- Spring Boot使用AOP的正确姿势
一.为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显.当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录.性能监控等,如果采用面向对象编程的方法, ...
- Git报错问题集锦
git merge合并时遇上refusing to merge unrelated histories的解决方案 如果git merge合并的时候出现refusing to merge unrelat ...
- wpf文字模糊
wpf如果使用了DropShadowEffect,会导致文字模糊,可以在window上设置 this.UseLayoutRounding = true;解决此问题
- 网络流(dinic算法)
洛谷p3376 https://www.luogu.com.cn/problem/P3376 #include <iostream> #include <cstdio> #in ...
- APP自动化 -- 获取toast元素的文本内容
一.toast元素 1.表现形式:toast元素就是下图中 “操作成功” 那个一闪而过的标签. 2.特殊点:因为一闪而过,时间太短,用UIAutomatorView截屏截不到. 二.获取方法 1.用 ...
- 笨办法学Python 3|百度网盘免费下载|新手基础入门书籍
点击下方即可百度网盘免费提取 百度网盘免费下载:笨办法学Python 3 提取码:to27 内容简介: 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用. ...
- 台账建立和sqlite数据库的数据导入和导入问题
principle platform command starts with "."; whiel sql command doesn't starts with ". ...
- 枚举-称硬币POJ1013
#include <iostream> #include<string.h> using namespace std; char Lleft[][]; char Lright[ ...
- python入门神书!|python编程从入门到实践|内附网盘链接带提取码|
点击此处进入网盘下载地址 提取码:o39n 全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 —— 游戏.数据可视化和 Web 应用程序,同时掌握让 ...