CF280D k-Maximum Subsequence Sum 题解(线段树+反悔贪心维护k段最大子段和)

news/2025/10/8 15:02:27/文章来源:https://www.cnblogs.com/XiaoQuQu/p/19129667

线段树维护区间最大子段和是好做的:每个节点维护当前最大子段和、从左端点开始的最大子段和、从右端点开始的最大子段和、当前节点的和。

这个题允许我们选择最多 \(k\) 段,于是我们可以考虑一个类似于反悔贪心的做法:一开始区间内所有元素的系数都是 \(+1\),代表所有元素都没选入答案。假设我们第一次选择了一个子区间 \([l,r]\in [L,R]\),则我们可以将 \([l,r]\) 的元素都乘以 \(-1\),代表答案中已经选择了 \([l,r]\) 这个区间的元素,然后再选择修改后的一个区间。

例如数组 \(a=[-1,100,-100,100,-1]\),第一次选择区间 \([2,4]\),则将 \(a\) 修改为 \([-1,-100,100,-100,-1]\),然后再选择此时的最大子段和区间 \([3,3]\),代表我们不选 \(3\) 这个元素。

容易发现,我们每次操作都会新增一个选段,所以最多进行 \(k\) 次这样的操作。如果一次操作时发现选择的子段和为负,则代表已经没有正贡献的元素了,可以直接停止。

于是我们只需要维护最大、最小子段和(因为要处理取相反数的操作),以及对应的方案。

时间复杂度 \(O(mk\log n)\).

const int MAXN = 1e5 + 5;
int n, m, a[MAXN];struct _sgt {struct _node {int sm, flg, lmx, rmx, mx, lmn, rmn, mn;int lmxi, rmxi, mxl, mxr, lmni, rmni, mnl, mnr;} tr[MAXN << 2];void update(_node &x, _node ls, _node rs) {x.sm = ls.sm + rs.sm;tie(x.lmx, x.lmxi) = max(make_pair(ls.lmx, ls.lmxi),make_pair(ls.sm + rs.lmx, rs.lmxi));tie(x.rmx, x.rmxi) = max(make_pair(rs.rmx, rs.rmxi),make_pair(rs.sm + ls.rmx, ls.rmxi));tie(x.mx, x.mxl, x.mxr) = max({make_tuple(ls.mx, ls.mxl, ls.mxr),make_tuple(rs.mx, rs.mxl, rs.mxr),make_tuple(ls.rmx + rs.lmx, ls.rmxi, rs.lmxi),});tie(x.lmn, x.lmni) = min(make_pair(ls.lmn, ls.lmni),make_pair(ls.sm + rs.lmn, rs.lmni));tie(x.rmn, x.rmni) = min(make_pair(rs.rmn, rs.rmni),make_pair(rs.sm + ls.rmn, ls.rmni));tie(x.mn, x.mnl, x.mnr) = min({make_tuple(ls.mn, ls.mnl, ls.mnr),make_tuple(rs.mn, rs.mnl, rs.mnr),make_tuple(ls.rmn + rs.lmn, ls.rmni, rs.lmni),});}void pushup(int p) {update(tr[p], tr[lson], tr[rson]);}void addtag(int p) {tr[p].flg = !tr[p].flg;tr[p].lmx *= -1;tr[p].rmx *= -1;tr[p].mx *= -1;tr[p].lmn *= -1;tr[p].rmn *= -1;tr[p].mn *= -1;tr[p].sm *= -1;swap(tr[p].lmx, tr[p].lmn);swap(tr[p].lmxi, tr[p].lmni);swap(tr[p].rmx, tr[p].rmn);swap(tr[p].rmxi, tr[p].rmni);swap(tr[p].mx, tr[p].mn);swap(tr[p].mxl, tr[p].mnl);swap(tr[p].mxr, tr[p].mnr);}void pushdown(int p) {if (!tr[p].flg) return;addtag(lson); addtag(rson);tr[p].flg = 0;}auto query(int p, int l, int r, int L, int R) {if (L <= l && r <= R) return tr[p];pushdown(p);int v = INT_MIN;_node res = {v, 0, v, v, v, v, v, v};auto ls = (L <= mid ? query(lson, l, mid, L, R) : res);auto rs = (mid < R ? query(rson, mid + 1, r, L, R) : res);update(res, ls, rs);return res;}void modify(int p, int l, int r, int L, int R) {if (L <= l && r <= R) return addtag(p);pushdown(p);if (L <= mid) modify(lson, l, mid, L, R);if (mid < R) modify(rson, mid + 1, r, L, R);pushup(p);}void build(int p, int l, int r) {if (l == r) {tr[p] = {a[l], 0, a[l], a[l], a[l], a[l], a[l], a[l], l, l, l, l, l, l, l, l};return;}build(lson, l, mid);build(rson, mid + 1, r);pushup(p);}void modify2(int p, int l, int r, int k, int v) {if (l == r) {tr[p] = {v, 0, v, v, v, v, v, v, l, l, l, l, l, l, l, l};return;}pushdown(p);if (k <= mid) modify2(lson, l, mid, k, v);else modify2(rson, mid + 1, r, k, v);pushup(p);}
} t;void work() {cin >> n;for (int i = 1; i <= n; ++i)cin >> a[i];t.build(1, 1, n);cin >> m;while (m--) {int op; cin >> op;if (op == 0) {int k, v; cin >> k >> v;t.modify2(1, 1, n, k, v);} else {int l, r, k, ans = 0; cin >> l >> r >> k;vector<pair<int, int>> v;for (int i = 1; i <= k; ++i) {auto res = t.query(1, 1, n, l, r);int tmp = res.mx, L = res.mxl, R = res.mxr;if (tmp < 0) break;ans += tmp;t.modify(1, 1, n, L, R);v.push_back({L, R});}for (auto [L, R]:v)t.modify(1, 1, n, L, R);cout << ans << endl;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳网站优化公司哪家好wap建站程序合集

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

做网站要分几部分完成广东网站建设方便

一、项目介绍 在游乐场、商场、景区等人流量较大的地方&#xff0c;往往存在用户需要临时存放物品的情况&#xff0c;例如行李箱、外套、购物袋等。为了满足用户的储物需求&#xff0c;并提供更加便捷的服务体验&#xff0c;当前设计了一款物联网智能储物柜。 该智能储物柜通…

2025年微信小程序开发:趋势、最佳实践与AI整合 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站点击率怎么建西安做公司网站

STM32G4系列单片机&#xff0c;为32位的微控制器&#xff0c;理论上其内部寄存器地址最多支持4GB的命名及查找&#xff08;2的32次方&#xff0c;地址命名为0x00000000至0xFFFFFFFF&#xff09;。STM32官方对4GB的地址存储进行编号时&#xff0c;又分割成了8个block区域&#x…

网站有哪几种类型做网站 华普花园

会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科&#xff0c;本专业培养具备财务、管理、经济、法律等方面的知识和能力&#xff0c;具有分析和解决财务、金融问题的基本能力&#xff0c;能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…

实验课1

实验1源代码1 #include<stdio.h> 2 int main() 3 { 4 printf(" o\n"); 5 printf("<H>\n"); 6 printf("I I\n"); 7 8 return 0; 9 } View Code运行…

做自我介绍的网站的图片素材怎么用动图做网站背景

Description Input 第一行为两个整数n, m。第二行有n个整数&#xff0c;为a1&#xff0c;a2, …, an。 Output 包含n行&#xff0c;每行m个1~nm的正整数&#xff0c;各不相同&#xff0c;以空格分开。如果有多解&#xff0c;输出任意一组解&#xff1b;如果无解&#xff0c;输出…

深入解析:【LeetCode 热题100】回溯:括号生成 组合总和(力扣22 / 39 )(Go语言版)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:基于 COM 的 XML 解析技术(MSXML) 的总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

asp网站开发需要什么网站建设 企业文化

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮人类的大部分细胞中&#xff0c;每时每刻都在进行着各种复杂的转录过程&#xff1b;这一过程与后续的蛋白质合成息息相关&#xff0c;从而会影响人体中各类酶、抗体、激素、免疫因子等生物分子的产生&#xff0c;最终影响人的身…

详细介绍:Windows如何定制键盘按键

详细介绍:Windows如何定制键盘按键pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

台州网站建设系统江苏网站建设电话

要搭建一个标准的测量系统,需要考虑以下几个方面: 确定测量目的和需求:首先需要明确测量的目的和需求,例如测量长度、重量、体积等。同时需要考虑测量的精度和误差范围,以及测量系统的适用范围和条件等。选择合适的传感器:根据测量目的和需求,选择合适的传感器类型,例如…

TheHackersLabs Templo writeup

信息收集 nmap获取userFlag 去web看一下web上只有一个默认的index.html,通过gobuster扫一下目录 gobuster dir -u http://192.168.43.208/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt 有一个w…

卖花网站模板太原网站优化培训

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…

深入解析:Oracle、PostgreSQL 与 MySQL 数据库对比分析与实践指南

深入解析:Oracle、PostgreSQL 与 MySQL 数据库对比分析与实践指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

PCIe扫盲——链路初始化与训练基础(三)之LTSSM

这一篇文章来简单地介绍一下链路训练状态机(Link Training and Status State Machine,LTSSM),并简要地介绍各个状态的作用和实现机制。 LTSSM有11个状态(其中又有多个子状态),分别是Detect、Polling、Configura…

嘉兴哪里可以做淘宝网站wordpress jquery异步请求

题目&#xff1a;洛谷P1850、UOJ#262、BZOJ4720、Vijos P2005。 题目大意&#xff1a;有n个时间段&#xff0c;第i个时间段只能在教室$c_i$上课&#xff0c;另一个上这门课的教室在$d_i$。现在你最多可以进行m次申请&#xff0c;对于第i个时间段的申请如果成功&#xff0c;那么…

#attrs

在 Vue 中,$attrs是一个核心的实例属性,用于处理 ​​父组件传递给子组件的非 Prop 属性​​。以下是其核心特性、使用场景及版本差异的详细解析: 一、核心概念​​定义​​ $attrs是一个对象,包含父组件传递给子组…

国庆比赛总结

没有摘要一些写在总结之前的话 感觉国庆这一段时间,真的是,疯狂挂分,每天感觉都在被完虐。然后也发现了很多不足吧,就是感觉自己其实大多数地方还是有很大问题的。 比赛 10/02 挂分最狠的一集 10/03 不会T2 10/04 …