[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 单词的划分
描述 有一个很长的由小写字母组成字符串.为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词.出于减少分析量的目的,我们希望划分出的单词数越少越好.你就是来完成这一划分工作的. ...
随机推荐
- 学Python入门应该先学什么?看完本文你就知道了
学Python应先从Python开发基础部分入手:1.如学习Python语言介绍2.环境安装3.Python基本语法4.基本数据类型5.二进制运算6.来流程控制.7.字符编码.文件处理8.数据类型9. ...
- myBatis源码解析-日志篇(1)
上半年在进行知识储备,下半年争取写一点好的博客来记录自己源码之路.在学习源码的路上也掌握了一些设计模式,可所谓一举两得.本次打算写Mybatis的源码解读. 准备工作 1. 下载mybatis源码 下 ...
- C语言中的 “>>”与“<<”
1. ">>" int x = 16; printf("%d\n", x >> 1); 先将x转成二进制 10000, 不读最后一位, ...
- 每日一道 LeetCode (1):两数之和
引言 前段时间看到一篇刷 LeetCode 的文章,感触很深,我本身自己上大学的时候,没怎么研究过算法这一方面,导致自己直到现在算法都不咋地. 一直有心想填补下自己的这个短板,实际上又一直给自己找理由 ...
- matplotlib基础汇总_01
灰度化处理就是将一幅色彩图像转化为灰度图像的过程.彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程.灰度值大的像素点比较亮(像素值最大为255,为 ...
- GitHub 热点速览 Vol.30:那些提升效率的小工具们
摘要:虽然 GitHub 是一个学习技术的好去处,但是除了学习,它还集提高"搬砖"效率于一身.GitHub 上散落着各式各样的小工具,比如本周特推的 Adobe 开源的 React ...
- ref以及传值传址的理解
ref(也包括out)关键字肯定都会用,传值调用和传址调用也是初学写代码时都已经历过的话题,与这相关的还有一些话题,比如值类型和引用类型有什么区别等,但是如果不仔细,可能有一些概念的混淆或者理解不够清 ...
- Skill 计算两点距离
https://www.cnblogs.com/yeungchie/ code procedure(ycHowFar(a b) prog((xAB yAB sAB) xAB = xCoord(a) - ...
- 【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)
题目描述 在有向无环图上给你两个起点和终点分别为$a,b,c,d$.问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点. $1\leq n\leq 200,1\le ...
- 打印java系统的信息
System.getProperties() 确定当前系统属性 Properties.list() 将获取到的信息打印到流中 public class Userone { public static ...