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. [Linux]终端设备关系

    1.概述 tty中基本上可以划分为console(/dev/console).虚拟终端(/dev/tty0~n)和伪终端(/dev/pts/0~n). 它们之间存在一定的关系. 为了说明这段关系,先要 ...

  2. AcWing 45. 之字形打印二叉树

    地址 https://www.acwing.com/problem/content/description/43/ 题目描述请实现一个函数按照之字形顺序从上向下打印二叉树. 即第一行按照从左到右的顺序 ...

  3. 用nodejs快速实现websocket服务端(带SSL证书生成)

    有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的 ...

  4. CSP 2019 游记

    Day -32 开坑. 没什么好说的,等个 5 天等初赛(应该叫第一轮认证)挂掉之后就能弃坑了. 今天开始停课,虽然每天只停半天,但是感觉还是特别的舒服~ 然而得等初赛过了才能全天停课-- 没关系,熬 ...

  5. C# Event在.Net规则下由接口定义的实现

    最近在学C#(教材<C# in a nutshell>很不错的说),看完delegate(委托)以后,紧接着就是event(事件)了,个人对跟.Net相关的东西并没有什么兴趣(毕竟是会增加 ...

  6. IT兄弟连 Java语法教程 流程控制语句 循环结构语句2

    双重for循环 如果把一个循环放在另一个循环体中,那么就可以形成嵌套循环,也就是双重for循环,当然嵌套循环也可以是for循环嵌套while循环,也可以是while循环嵌套while循环……,即各种类 ...

  7. Java-100天知识进阶-Java内存-知识铺(四)

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. 1.Java内存模型是每个java程序员必须掌握理解的 2.Java内存模型的主要目标 ...

  8. PHP TP框架自定义打印函数P

    效果如下,有个灰色背景,也不一定是灰色可以改 代码: //传递数据以易于阅读的样式格式化后输出function p($data){ // 定义样式 $str='<pre style=" ...

  9. 使用C#+Edge (Chromium)进行Web自动化测试

    今天看到了VisualStudio中现在已经自带了Web单元测试项目模板,便试了一下,发现还比较好用,它默认的是Selenium实现的,测试组在用Selenium+Python来写过自动化测试,原来它 ...

  10. 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)

    场景 SpringCloud -创建统一的依赖管理: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574 Sprin ...