巴沛若 发表于 2025-6-4 16:56:31

P5665 [CSP-S2019] 划分

思路:

首先求出 \(a\) 的前缀和数组 \(s\)。
考虑动态规划,令 \(dp_{i,j}\) 表示以 \(i\) 结尾,末尾有 \(j\) 个为一组的最小答案,则状态转移方程为:

\ dp_{i-j,k} + (s_i - s_{i-j})^2\]
朴素直接转移是 \(O(N^3)\) 的,可以得到 36pts 的好成绩代码就懒的给了。
考虑优化,对于求出最小的一个 \(k\),使得 \(s_{i-j}-s_{i-j-k} > s_i - s_{i-j}\),那么状态转移方程为:

\
后面的一串可以提前前缀预处理好,现在的复杂度在求 \(k\) 上,注意到 \(s_{i,j} - s_{i-j-k}\) 是单调的,那么直接二分即可。
时间复杂度优化至 \(O(N^2 \log N)\)。
$O(N^2 \log N)$ 代码#include#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)#define lowbit(x) x&(-x)#define pi pair#define pii pair#define iip pair#define ppii pair#define fi first#define se second#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x#define Full(a) memset(a,0,sizeof(a))#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);using namespace std;typedef double db;typedef unsigned long long ull;typedef long long ll;bool Begin;const ll N=5050,INF=4e18;inline ll read(){    ll x=0,f=1;    char c=getchar();    while(c'9'){      if(c=='-')          f=-1;      c=getchar();    }    while(c>='0'&&c

佴莘莘 发表于 2025-10-18 09:51:18

感谢分享,学习下。

窖咎 发表于 2025-10-21 06:22:32

前排留名,哈哈哈

更成痒 发表于 2025-10-27 06:23:09

用心讨论,共获提升!

打阗渖 发表于 2025-11-23 00:43:47

感谢分享,下载保存了,貌似很强大

能氐吨 发表于 2025-12-4 15:22:52

收藏一下   不知道什么时候能用到

愆蟠唉 发表于 2026-1-3 09:53:53

这个有用。

兑谓 发表于 2026-1-6 12:43:26

感谢分享

忌才砟 发表于 2026-1-11 14:48:34

yyds。多谢分享

薯羞 发表于 2026-1-20 14:23:50

谢谢楼主提供!

貊淀 发表于 2026-1-21 13:02:18

收藏一下   不知道什么时候能用到

左优扬 发表于 2026-1-23 09:27:04

谢谢分享,辛苦了

遑盲 发表于 2026-1-27 06:21:14

谢谢楼主提供!

赶塑坠 发表于 2026-1-28 03:39:50

分享、互助 让互联网精神温暖你我

臧莞然 发表于 2026-2-3 02:41:53

感谢分享

呈步 发表于 2026-2-6 07:28:25

喜欢鼓捣这些软件,现在用得少,谢谢分享!

水苯 发表于 2026-2-6 08:52:23

感谢分享,学习下。

喳谍 发表于 2026-2-6 11:44:23

分享、互助 让互联网精神温暖你我

咪四 发表于 2026-2-8 04:27:24

感谢,下载保存了

敖可 发表于 2026-2-8 07:07:35

前排留名,哈哈哈
页: [1] 2
查看完整版本: P5665 [CSP-S2019] 划分