题目

题解

首先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分的要写高精,但正确性是有的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #define int long long
  4. using namespace std;
  5. #define N 4*(int)1e7+10
  6. int sum[N],pre[N],q[N],dp[N],l=1,r=0;
  7. #define val(a) (2*sum[a]-sum[pre[a]])
  8. signed main()
  9. {
  10. int n,type;
  11. cin>>n>>type;
  12. for(int i=1;i<=n;i++)
  13. {
  14. int a;
  15. scanf("%lld",&a);
  16. sum[i]=sum[i-1]+a;
  17. }
  18. q[++r]=0;
  19. for(int i=1;i<=n;i++)
  20. {
  21. while(l<r&&val(q[l+1])<=sum[i]) l++;
  22. pre[i]=q[l];
  23. dp[i]=dp[pre[i]]+(sum[i]-sum[pre[i]])*(sum[i]-sum[pre[i]]);
  24. while(l<=r&&val(i)<=val(q[r])) r--;
  25. q[++r]=i;
  26. }
  27. cout<<dp[n];
  28. }

[NOIP2019] 划分的更多相关文章

  1. [LeetCode] Partition List 划分链表

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  2. SWMM模型子汇水区划分的几种方法

    子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...

  3. 等价类划分方法的应用(jsp)

    [问题描述] 在三个文本框中输入字符串,要求均为1到6个英文字符或数字,按submit提交. [划分等价类] 条件1: 字符合法; 条件2: 输入1长度合法; 条件3: 输入2长度合法: 条件4: 输 ...

  4. Java上等价类划分测试的实现

    利用JavaFx实现对有效等价类和无效等价类的划分: 代码: import javafx.application.Application;import javafx.event.ActionEvent ...

  5. ENode框架Conference案例分析系列之 - 上下文划分和领域建模

    前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的 ...

  6. Cesium原理篇:2最长的一帧之网格划分

    上一篇我们从宏观上介绍了Cesium的渲染过程,本章延续上一章的内容,详细介绍一下Cesium网格划分的一些细节,包括如下几个方面: 流程 Tile四叉树的构建 LOD 流程 首先,通过上篇的类关系描 ...

  7. 两种交换机配置模式,以配置基于端口划分的VLAN为例

    关于交换机的配置模式,大体上可以分为两类:其一以CISCO交换机为代表的配置模式,其二以Huawei.H3C交换机为代表的配置模式.其实这两种配置模式并没有本质的不同,只是配置的命令名称和配置方式存在 ...

  8. tyvj1194 划分大理石

    描述 有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现.其中大理石的总数不超过20000.  输入格式 有多组数据!所以可能有多行如果有0  ...

  9. tyvj1102 单词的划分

    描述 有一个很长的由小写字母组成字符串.为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词.出于减少分析量的目的,我们希望划分出的单词数越少越好.你就是来完成这一划分工作的. ...

随机推荐

  1. HashMap源码实现分析

    HashMap源码实现分析 一.前言 HashMap 顾名思义,就是用hash表的原理实现的Map接口容器对象,那什么又是hash表呢. 我们对数组都很熟悉,数组是一个占用连续内存的数据结构,学过C的 ...

  2. 基于python实现查询ip地址来源

    接口调用方法是在url后面直接加上IP地址. url = 'http://freeapi.ipip.net/218.192.3.42' #中文免费 url2 = 'http://ip-api.com/ ...

  3. .net core 使用 Serilog 作为日志提供者

    nuget引入 Serilog.AspNetCore Startup构造函数: public Startup(IConfiguration configuration) { Configuration ...

  4. django-rest-framework-源码解析003-视图家族和路由(APIView/GenericAPIView/mixins/generics/viewsets)

    视图家族 视图家族在rest_framework源码位置和学习曲线为: rest_framework.views: 基本视图(APIView) rest_framework.generics: 工具视 ...

  5. Nginx实现JWT验证-基于OpenResty实现

    介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问 ...

  6. Day10_ElasticSearch

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 老师的码 ...

  7. PHP preg_grep() 函数

    preg_grep 函数用于返回匹配模式的数组条目.高佣联盟 www.cgewang.com 语法 array preg_grep ( string $pattern , array $input [ ...

  8. linux之FTP服务搭建 ( ftp文件传输协议 VSFTPd虚拟用户)

    FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...

  9. Win10系统安装MySQL Workbench 8

    系统:Window10 专业版 MySQL Workbench 8.0.19 下载地址:https://dev.mysql.com/downloads/workbench/8.0.html 点击Dow ...

  10. Pytorch_第七篇_深度学习 (DeepLearning) 基础 [3]---梯度下降

    深度学习 (DeepLearning) 基础 [3]---梯度下降法 Introduce 在上一篇"深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数" ...