当前位置: 首页 > news >正文

P10977 Cut the Sequence 分析

题目概述

你需要将一个长度为 \(n\) 的序列 \(A\) 分成若干段,满足每段中数字之和 \(\leq m\),每段将这一段的最大值作为他的贡献,求他们贡献之和的最小值。

分析

蓝书好题!这是一道例题。

不难设 \(f_i\) 表示前 \(i\) 个数分成若干段所得到的最小答案。

显然转移有:

\[f_i=\min_{j\in[0,i-1],\sum_{k=j + 1}^i a_k\leq m}\{f_j+\max_{k\in[j+1,i]}a_k\} \]

直接转移是 \(\mathcal{O}(n^2)\) 的。

\(dp\) 的转移优化的指导思想就是及时排除不可能的决策。

我们不难根据题目的意思发现:\(f_i\) 是单调不降的。

\(a_{j}\leq a_{j+1}\)。那么显然:

\[f_{j-1}+\max\leq f_j+\max \]

也就是说我们维护一个依据坐标的 \(a_x\) 单调递减的队列即可。

当然我的转移还有可能来自最远的那个点。

代码

时间复杂度 \(\mathcal{O}(n\log n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <set>
#define int long long
#define N 100005
using namespace std;
int n,f[N],a[N],m,sum[N];
int head,tail,q[N << 2];
multiset<int> st;
signed main(){cin >> n >> m;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]),sum[i] = sum[i - 1] + a[i];for (int i = 1;i <= n;i ++)if (a[i] > m) return cout << -1,0;head = 1,tail = 0;for (int i = 1;i <= n;i ++) {while(head <= tail && sum[i] - sum[q[head]] > m) st.erase(f[q[head]] + a[q[head + 1]]),head ++;while(head <= tail && a[i] > a[q[tail]]) st.erase(f[q[tail - 1]] + a[q[tail]]),tail --;//纯粹更新fj+mx中的mx,因为你mx变大了那么肯定是越前面的点相较于当前的队尾的点更优啊if (head <= tail) st.insert(f[q[tail]] + a[i]);q[++tail] = i;int l = 0,r = i - 1,res = 0;while(l <= r) {int mid = l + r >> 1;if (sum[i] - sum[mid] <= m) res = mid,r = mid - 1;else l = mid + 1;}f[i] = f[res] + a[q[head]];if (!st.empty()) f[i] = min(f[i],*st.begin());}cout << f[n];return 0;
}//这题不难想到也可以用线段树优化dp

代码中的注释很精髓的。

http://www.jsqmd.com/news/50799/

相关文章:

  • 人工智能之数据分析 numpy:第十五章 项目实践
  • 租房买房必看1为什么户型不方正,会让你越住越穷?
  • 点灯笔记:PY32F002B
  • 软件工程学习日志2025.11.25
  • 实用指南:Stable Diffusion 短视频制作算力需求与优化策略研究
  • IT外包与勒索软件:英国经济安全面临的技术风险
  • NumPy广播机制深度解析:为什么有时能加,有时报错?
  • 2025年微信公众号编辑器Top7权威评测:全能型工具让效率提升300%
  • 如何高效地学习Java编程?
  • STL常用功能
  • 2025/11/25-Xs new location transparency feature unleashes questions about origins of MAGA accounts
  • 实用指南:【底层机制】深入浅出地、系统地剖析 Appium 的原理
  • Go 语言未来会取代 Java 吗?
  • 玄机钓鱼邮件分析_2025/11/25
  • 容错量子电路大幅降低资源开销
  • 详细介绍:【C基本功】类型转换的奇幻漂流
  • 点灯笔记:CW32L010
  • Rust 零拷贝技术:从所有权到专业的系统调用的性能优化之道
  • 服务器代码执行三板斧
  • 过山车
  • 2025年下半年奖牌/水晶奖杯/奖杯定制/定制厂家口碑推荐榜
  • day07 spark sql - 详解
  • 深入解析:系统架构设计师备考第57天——云原生架构相关技术
  • 2025年舒适操控的轮胎推荐:TOP5专业测评深度揭秘
  • 2025年宝马5系更换轮胎推荐:TOP5专业榜单权威推荐
  • 低代码 vs 无代码:核心差异、适用场景与选型决策
  • 【ArcMap】将一个线图层的属性字段连接到另一个线图层
  • 低代码平台选型指南:企业避坑指南与核心评估维度
  • detectron2 框架安装
  • IMX6D的LVDS调试