CSP-S 2019 划分

划分

将一个序列分为m(m自己决定)并且每一段的和递增 求i=0msi2

si为每一段的和

subtask1 期望得分 36pts

比较好想 f[i][j]表示最后一段尾部端点尾i 头端点为j 的最小代价

f[i][j]=max(f[j][k]+sqr((s[i]s[j])))

subtask2 期望得分 64pts

可以优化一下枚举i,j然后二分找到k 时间复杂度O(n2logn)

subtask3 期望得分 64pts

可以证明如果一个区间大于前面的区间 且可以分为 a b (pre <= a <= b)

那么将他分开一定是最优的 那么对于一个i 我们去维护一个f[i]并且使得s[i]s[f[i]]最小化 答案一定是最优的

我们可以(n2)找到一个最优的f[i]然后就得到了64pts的高分

std 期望得分 100pts

暴力O(n2)未免太暴力了 我们可以想满足条件 s[i]s[j]>=s[j]s[f[j]]

移项可得s[i]>=s[j]2s[f[j]] 我们只需找到最后一个满足这个条件的值

然后f[i]=j就行了 这个东西可以用单调队列去写

int head = 1, tail = 1; 
for (int i = 1; i <= n; i ++ ) { 
	while (head < tail && calc (q[head + 1]) <= s[i]) head ++ ; 
	g[i] = q[head]; 
	while (head < tail && calc (q[tail]) >= calc (i)) tail -- ; 	
	q[++tail] = i; 
} 
for (int i = n; i >= 1; i = g[i]) ans = (ans + sqr (s[i] - s[g[i]]));

分析

36比较navie难度普及

64 分析性质 难度提高

100 用单调队列维护不难想 关键是前面一步的证明 难度提高+

posted @   Hock  阅读(556)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示