[CF2043C] Sums on Segments 题解

news/2025/1/1 18:26:39/文章来源:https://www.cnblogs.com/wfc284/p/18639585

我们先想全是 \(\pm 1\) 的。令区间内最小子段和为 \(mn\),最大子段和为 \(mx\),注意到 \([mn,mx]\) 内的数全都能被凑出来。

  • 证明:我们在区间 \([l,r]\) 内任意取一个子区间 \([l',r']\)

    • 定义【扩展】为将一个区间左边或右边添加一个数。
    • 定义【收缩】为将一个区间左边或右边去掉一个数。

    我们发现所有 \([l,r]\) 的子区间都能通过 \([l',r']\)【扩展】或【收缩】得到。而对于【扩展】或【收缩】,操作前后的 \(sum\) 一定是连续的。于是,所有子区间的 \(sum\) 都是连续的。所谓【连续】,当然是从最小和连续到最大和。

\([mn,mx]\) 内的数加入答案即可。

对于有特殊值的,类似分治的思想,劈两半算两遍,再管包含特殊值的区间。和一定是左半的后缀加特殊值加右半的前缀。同理,只会取到最小值到最大值的所有数。

排序,去重,输出即可。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define all(v) v.begin(), v.end()
using namespace std;//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)namespace Traveller {const int N = 2e5+2;int n, a[N];vector<int> ans;int sum[N];void work(int *a, int n) {int x = 0, y = 0;int mx = 0, mn = 0;	//初值的艺术int sum = 0;for(int i = 1; i <= n; ++i) {sum += a[i];mx = max(mx, sum - y);mn = min(mn, sum - x);x = max(x, sum);y = min(y, sum);}for(int i = mn; i <= mx; ++i) ans.push_back(i);}void main() {cin >> n;for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);for(int i = 1; i <= n; ++i) sum[i] = sum[i-1] + a[i];int p = -1;for(int i = 1; i <= n; ++i)if(abs(a[i]) != 1) {p = i;break;}ans.clear();if(~p) {int mx = 0, mn = 0;int x = 0, y = 0;work(a, p-1);for(int i = p-1; i >= 0; --i)x = max(x, sum[p-1] - sum[i]), y = min(y, sum[p-1] - sum[i]);mx += x, mn += y;x = y = 0;work(a+p, n-p);for(int i = p; i <= n; ++i)x = max(x, sum[i] - sum[p]), y = min(y, sum[i] - sum[p]);mx += x, mn += y;for(int i = mn; i <= mx; ++i) ans.push_back(i + a[p]);}else work(a, n);sort(all(ans));ans.erase(unique(all(ans)), ans.end());printf("%d\n", (int)ans.size());for(int ele : ans) printf("%d ", ele);puts("");}
}signed main() {#ifdef filenameFileOperations();#endifint _;cin >> _;while(_--) Traveller::main();return 0;
}

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

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

相关文章

UE4.27, 揣摩源码, 序列化 (三) FLinkerLoad, FLinkerSave

3. FLinkerLoad, FLinkerSave分别是UObject的反序列化和序列化的内核3.0. UPackage与UObjectUObject因为涉及与其他UObject的复杂引用关系,如果我们客制化地单独正反序列化每一个UObject,我们会在反序列化的时候惊觉这是繁琐而不可能的。为了满足UObject这种复杂的对象的序列…

设计Element UI表单组件居然如此简单!

0 前言 上文讲解了Jest框架对组件库测试,TypeScript和Jest都为代码质量和研发效率。之前实现Container和Button组件以渲染功能为主,可根据不同属性渲染不同样式去实现布局和不同格式的按钮。 本文的表单组件,除了要渲染页面组件,还支持很好页面交互,从Element3的表单组件开…

Kubernetes(v1.29)学习笔记

什么是KubernetesK8s是Kubernetes的简称,是一个开源的容器编排系统,用于自动部署、扩展和管理容器化应用程序。 Kubernetes源于希腊语,意为“舵手”或“飞行员”,其主要功能包括服务发现与负载均衡、存储编排、Secret和配置管理、批量执行、水平扩缩、自动化上线和回滚、自…

简答题

1 冯诺依曼结构计算机的基本思想是什么 ?按此思想设计的计算机硬件系统的应由那些部件组成,它们各有什么作用? 存储程序和程序控制是冯诺依曼结构计算机的主要设计思想。存储程序是指将解题的步骤编写为程序,然后将程序和运行程序所需要的数据以二进制的形式存放到存储器中…

基于双PI控制器和三电平SVPWM交流同步直线电机矢量控制系统的simulink建模与仿真

1.课题概述基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真。通过PSO粒子群优化进行最大功率跟踪。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介光伏(Photovoltaic, PV)发电系统利用太阳能直接转换成电能,是实现可持续能源战略的重要组成部分。…

Gridview使用CheckBox全选与单选 Version 3

还是有网友开发ASP.NET程序,今天联系Insus.NET说,参考下面随笔,无法实现,没有效果。Gridview使用CheckBox全选与单选 Version 2 https://www.cnblogs.com/insus/archive/2013/05/22/3093114.html 几番仔细检查,放大对着搬,照抄,没能错呀!说实的,具体原因,Insus.NET…

RL中on-policy和off-policy的本质区别/重要性采样

讨论了on-policy和off-policy的本质区别。说明了off-policy MC和off-policy TD是如何利用重要性采样的,以及为什么Q-learning不需要进行重要性采样。本随笔的图片都来自UCL强化学习课程lec5 Model-free prediction的ppt (Teaching - David Silver ). 回忆值函数的表达式: \[v…

2024-2025-1 20241319 《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 《C语言程序设计》第13章作业正文 https://www.cnblogs.com/wchxx/p/18639513**教材学习内容总结 1. 文件的打开与关闭…

视野修炼-技术周刊第115期 | 现代的 Nodejs 能力

① 一些现代的 Nodejs 能力 ② MarkItDown ③ ReactAI ④ 背景移除 ⑤ 智能图片描述生成器生成器欢迎来到第 115 期的【视野修炼 - 技术周刊】,下面是本期的精选内容简介 🔥强烈推荐一些现代的 Nodejs 能力🔧开源工具&技术资讯MarkItDown ReactAI🤖AI工具&资讯背…

2024-2025-1(20241321)《计算机基础与程序设计》第十四周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十四周作业)这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>作业正文 ... 本博客链接https://www.…

11. 日期和时间控件

一、日期和时间控件日期和时间类也是 PySide6 中的基本类,利用它们可以设置纪年法、记录某个日期时间点、对日期时间进行计算等。用户输入日期时间及显示日期时间时需要用到日期时间控件,本节介绍有关日期时间的类及相关控件。我们可以在终端中使用 pip 安装 pyside6 模块。 …

浅析FHQ-treap

前言 更好的阅读体验 默认读者会 BST 的基本操作。 节点定义 替罪羊树采用了懒惰删除的方法,不会立即删除某个点,而是在重构时不放进数组。 struct node{ int ch[2], val; int siz1, siz2, cnt, sum; //扣去懒惰删除的节点数量,没扣去懒惰删除的节点数量,树内相同权值的…