Description

传送门

Solution

算法1 12pts

指数算法随便乱搞。

算法2 36pts

\(O(n^3)\)dp。

设\(f_{i,j}\)表示以位置\(j\)结尾,上一个决策点为\(j\)时的最小值。

转移也是显而易见的:

令 \(s_i=\sum \limits_{j=1}^{i} a_j\),即前缀和。

\[f_{i,j}=f_{j,k}+(s_i-s_j)^2,其中 s_i-s_j \ge s_j-s_k
\]

#include <bits/stdc++.h>
using namespace std; typedef long long ll; inline ll ty() {
char ch = getchar(); ll x = 0, f = 1;
while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
} const int _ = 5000 + 10;
int n, type;
ll A[_], sum[_], f[_][_], ans; inline ll _2(ll x) { return x * x; } int main() {
n = ty(), type = ty();
for (int i = 1; i <= n; ++i) {
A[i] = ty();
sum[i] = sum[i - 1] + A[i];
// cout << sum[i] << endl;
}
memset(f, 0x3f, sizeof(f));
ans = f[0][0];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
if (j == 1) f[i][j] = _2(sum[i]);
else
for (int k = 1; k < j; ++k)
if (sum[i] - sum[j - 1] >= sum[j - 1] - sum[k - 1])
f[i][j] = min(f[i][j], f[j - 1][k] + _2(sum[i] - sum[j - 1]));
}
} for (int i = 1; i <= n; ++i) ans = min(ans, f[n][i]);
printf("%lld\n", ans);
return 0;
}

算法3 64pts

\(O(n^2)\)dp。这个因为我太蒻了,所以不会写。大概思路就是

“可以固定\(j\),发现在移动\(i\)的过程中,\(k\)也在移动,满足一个单调性,然后我们维护一个\(f_{j,k}\)的最小值就可以了”

算法4 84/100pts

据说通过打表可以发现,证明链接,当最后一段在满足有解的情况下和最小时,答案最优。

因此可以设\(g_i\)表示到位置\(i\)时,在有解的情况下值最小的上一个决策点的位置,即

\[g_i = \max \limits_{j=0}^{i-1}j, s.t. s_i-s_j \ge s_j-s_{g_j}
\]

稍微移个项就可以得到

\[s_i \ge 2s_j-s_{g_j}
\]

显然这是单调的,于是用一个单调队列维护即可。

Code

#include <bits/stdc++.h>
using namespace std; inline int ty() {
char ch = getchar(); int x = 0, f = 1;
while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
} typedef long long ll;
const int _ = 5e5 + 10;
int n, type, a[_], q[_], g[_];
ll sum[_], ans; inline ll calc(int j) { return 2ll * sum[j] - sum[g[j]]; }
inline ll _2(const ll &x) { return x * x; } int main() {
#ifndef ONLINE_JUDGE
freopen("divide.in", "r", stdin);
freopen("divide.out", "w", stdout);
#endif
n = ty(), type = ty();
for (int i = 1; i <= n; ++i) a[i] = ty(), sum[i] = sum[i - 1] + a[i];
int h = 1, t = 1;
for (int i = 1; i <= n; ++i) {
while (h < t && calc(q[h + 1]) <= sum[i]) ++h;
g[i] = q[h];
while (h < t && calc(q[t]) >= calc(i)) --t;
q[++t] = i;
}
int now = n;
while (now) {
ans = ans + _2(sum[now] - sum[g[now]]);
now = g[now];
}
printf("%lld\n", ans);
return 0;
}

【CSP-S 2019】D2T2 划分的更多相关文章

  1. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  2. @CSP模拟2019.10.16 - T3@ 垃圾分类

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个 ...

  3. 「CSP-S 2019」划分

    description loj 3212 solution 首先容易想到\(n^3\)DP,即令\(f_{i,j}\)表示前\(i\)个数的划分,其中最后一段是从\(j\)开始时的答案 于是有 \[f ...

  4. [十二省联考2019]D2T2春节十二响

    嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...

  5. CSP2019 D2T2 划分 (单调队列DP)

    题目 洛谷传送门 题解 就是这道题搞我退役考场上写了n^2 64分,结果爆成8-12分.直接GG. 考场上想到正解的写法被自己否决了 题解传送门(看到这道送我退役的题目⑧太想写题解) 六行O(n2)O ...

  6. CSP/NOIP 2019 游记

    Day0 打牌 Day1 \(T1\) 没开\(ull\), 不知道有几分 \(T2\) \(N^2\)暴力+链, 没搞出树上做法, \(70\)分 \(T3\) 标准\(10\)分( 感觉今年省一稳 ...

  7. 【置顶】CSP/S 2019退役祭

    标题没错,今年就是我的最后一年了. 才高一啊,真不甘心啊. DAY1(之前的看前几篇博客吧) T1 现在没挂 T2 貌似是树形DP,跑到80000的深度时挂了,于是特判了链的情况,大样例过了,现在没挂 ...

  8. [CSP-S2019]划分 题解

    CSP-S2 2019 D2T2 考场上读完题感觉是DP就直接扔了开T3了,考完才发现部分分好像不难拿,枯了 题意分析 给出一个数列,要求将其分成几段,使每段的和非严格递增,求最小的每段的和的平方和. ...

  9. CSP-S2019 游记

    想到正解,不一定赢 全部打满,才是成功 Day 0 首先很感谢各位朋友送的贺卡!!! 早上10点的高铁.今年可以直接在汕头站坐高铁不用专门跑到潮汕站了,1h->15min车程,巨大好评. 虽然离 ...

随机推荐

  1. Ovirt 简单配置

    Ovirt是一款开源的虚拟化平台管理 主要组成: 1.OvirtEngine Server 用于管理和分配资源 ,能通过web管理 2.Hosts 提供虚拟化功能,提供CPU资源和内存资源,用于分配给 ...

  2. #undef常用法

    Copy from C语言中#undef的语法是: #undef 标识符 用来将前面定义的宏标识符取消定义. 整理了如下几种常见用法,如果以后发现其他的再添加进来. 1.在一个程序块中用完宏定义后,为 ...

  3. RMAN详细教程(四):备份脚本实战操作

    RMAN详细教程(一):基本命令代码 RMAN详细教程(二):备份.检查.维护.恢复 RMAN详细教程(三):备份脚本的组件和注释 RMAN详细教程(四):备份脚本实战操作 1.为了安全起见,先将数据 ...

  4. Vue之外的杂谈笔记

    1.老项目的构建输出为什么臃肿? 引用:(引自http://www.cnblogs.com/linfangshuhellowored/p/5657285.html) 答:因为使用的是require的r ...

  5. Selenium+java - 关于富文本编辑器的处理

    什么是富文本编辑器? 富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器.具体长啥样,如下图: 通过自动化操作富文本编辑器 模拟场景:在富文 ...

  6. Linux vi文档操作

    使用操作 a 在光标后插入    A 插入行末   i 在光标前插入   I 插入行首 o 向下切换一行 O 向上开一行 dd 删除一整行 x 删除光标后一个字符   X 删除光标前一个字符 shif ...

  7. SSD与HDD、HHD的区别

    SSD与HDD.HHD的区别 HDD机械硬盘 SSD固态硬盘 HHD混合硬盘

  8. solidity 智能合约之间的调用

    智能合约之间的调用 在区块链上,有些功能往往无法通过一个智能合约完成,此时便会用到智能合约之间的调用.本篇文章带大家通过具体示例来了解一下智能合约之间的调用. 在智能合约的编译过程中,有两种情况:调用 ...

  9. 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();   ...

  10. ASP.NET Core基于K8S的微服务电商案例实践--学习笔记

    摘要 一个完整的电商项目微服务的实践过程,从选型.业务设计.架构设计到开发过程管理.以及上线运维的完整过程总结与剖析. 讲师介绍 产品需求介绍 纯线上商城 线上线下一体化 跨行业 跨商业模式 从0开始 ...