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

AT_abc407_f [ABC407F] Sums of Sliding Window Maximum

AT_abc407_f [ABC407F] Sums of Sliding Window Maximum

洛谷题目传送门

ATcoder题目传送门

题目描述

给你一个长度为 NNN 的数列 A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1,,AN),请对于所有 1≤k≤N1\le k\le N1kN 求解下面的问题:

  • 求出 AAA 长为 kkk 的全部 N−k+1N-k+1Nk+1 个连续子序列的最大值的和。

输入格式

将按照以下格式输入:

NNN

A1A_1A1 $ A_2$ A3A_3A3 …\dots ANA_NAN

输出格式

NNN 行,第 iii 行为 k=ik=ik=i 时所求解问题的答案。

输入输出样例 #1

输入 #1

4
5 3 4 2

输出 #1

14
13
9
5

输入输出样例 #2

输入 #2

8
2 0 2 5 0 5 2 4

输出 #2

20
28
27
25
20
15
10
5

输入输出样例 #3

输入 #3

11
9203973 9141294 9444773 9292472 5507634 9599162 497764 430010 4152216 3574307 430010

输出 #3

61273615
68960818
69588453
65590626
61592799
57594972
47995810
38396648
28797486
19198324
9599162

说明/提示

数据规模与约定

  • 1≤N≤2×1051 \le N \le 2 \times 10^{5}1N2×105
  • 0≤Ai≤107(1≤i≤N)0 \le A_i \le 10^{7} (1 \le i \le N)0Ai107(1iN)
  • 输入的所有数字为整数。

思路详解

思路引入

题目让我们对每一个kkk求长度为kkk的连续子数组的最大值之和。假如kkk是一个定值,那这个题就是滑动窗口了。可是这个题的kkk是不定的,枚举kkk又会超时,那该怎么办呢?

我们显然不能再枚举kkk了,我们需要考虑iii对所有kkk的贡献。不难发现,假如定义lil_{i}liiii往前第一个大于iii的,rir_{i}riiii往后第一个大于等于iii的(一个取等一个不取等是为了防止重复,就和很多个[l,r)[l,r)[l,r)加起来一样)。则iii只可能在区间[li,ri][l_{i},r_{i}][li,ri]中有贡献。记录xmin,xmaxx_{min},x_{max}xmin,xmaxi−li+1,ri−i+1i-l_{i}+1,r_{i}-i+1ili+1,rii+1的最小/最大值。那可以按如下分类:

  1. 记录当前长度为kkk,当kϵ[1,xmin−1]k \epsilon[1,x_{min}-1]kϵ[1,xmin1]时,我们发现此时区间都有可能取不到iiiiii对他只有kkk次贡献(区间穿过iii,每个位置各一次,一共kkk)。
  2. kϵ[xmin,xmax)k \epsilon[x_{min},x_{max})kϵ[xmin,xmax)时,区间比小的那一段长,但是没有大的长,所以xmin−ix_{min}-ixmini都可以作为区间起点,包含iii且不会超过xmaxx_{}maxxmaxiii的贡献恒为xminx_{min}xmin
  3. kϵ[xmax,ri−li+1]k \epsilon[x_{max},r_i-l_i+1]kϵ[xmax,rili+1]时,区间一定包含iii,但只有ri−li+1−k+1r_i-l_i+1-k+1rili+1k+1个起点,所以贡献只有ri−li+1−k+1r_i-l_i+1-k+1rili+1k+1

我们发现,情况1、3的贡献次数都和kkk有关,由于kkk的变化量为1,则转化为函数的话,这两段一次函数的斜率都为1,即一个公差为1的等差数量,思考如何直接加一段等差数列???直接使用二阶差分,将差分数组在差分一次,那我们就这么干:

  1. 在1的位置加1,表示这一段的公差加1。
  2. xmin−1x_{min}-1xmin1的位置减1,表示后面的公差为0。
  3. xmaxx_{max}xmax的位置再减1,表示后面的公差为-1。
  4. ri−li+1r_i-l_i+1rili+1的位置加1,表示区间结束了。

过程分析

过程大概如下:

  1. 求得数组li,ril_{i},r_{i}li,ri,由于要找最近的,我们可以用单调栈解决。
  2. 对每个iii计算他的贡献,用二阶差分标记。
  3. 求两次前缀和,还原最后的答案。

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e5+5;
ll n,a[N],ans[N];
ll l[N],r[N];
int main(){
//我们发现这个题目如果k固定就变为滑动窗口,可是k不固定该怎么办呢
//首先枚举k是不可能的,那我们只能思考一个数对所有k的贡献
//显然一个数只会在一个区间能取到他且他为最大值时有贡献
//那在定义l[x]为左边第一个大于等于x,r[x]为右边第一个大于x的(一边取等是为了防止重复,类似于多个[) )
//那显然在l[x]左或r[x]右都无贡献
//若k很小,小到甚至可能在区间[l[x],r[x]]取不到x
//那x对k的贡献显然只有包含x的k次,且此时k<min(x-l[x]+1,r[x]-x+1)
//当min(x-l[x]+1,r[x]-x+1)<=k<max(x-l[x]+1,r[x]-x+1)时
//我们可以取min(x-l[x]+1,r[x]-x+1)次区间开头,而且整个区间一定都在范围内
//所以x有min(x-l[x]+1,r[x]-x+1)次贡献
//当max(x-l[x]+1,r[x]-x+1)<=k<r[x]-l[x]+1时
//只能取r[x]-l[x]+1-k+1次结尾,且此时开头一定在区间内,所以有r[x]-l[x]+1-k+1次贡献
//我们发现贡献先加大,且每次都加a[x]
//后不变,最后减小,且每次都减a[x]
//所以直接二阶差分即可cin>>n;for(ll i=1;i<=n;i++)cin>>a[i];stack<ll>st;for(ll i=1;i<=n;i++){//求l数组while(st.size()&&a[st.top()]<=a[i])st.pop();l[i]=st.size()?st.top():0;st.push(i);}while(st.size())st.pop();//记得清空for(ll i=n;i>=1;i--){//求r数组while(st.size()&&a[st.top()]<a[i])st.pop();r[i]=st.size()?st.top():n+1;st.push(i);}for(ll i=1;i<=n;i++){//差分ll xmin=min(i-l[i]+1,r[i]-i+1),xmax=max(i-l[i]+1,r[i]-i+1);ans[1]+=a[i];ans[xmin]-=a[i];ans[xmax]-=a[i];ans[r[i]-l[i]+1]+=a[i];}for(ll i=1;i<=n;i++)ans[i]+=ans[i-1];for(ll i=1;i<=n;i++)ans[i]+=ans[i-1];for(ll i=1;i<=n;i++)cout<<ans[i]<<'\n';return 0;
}
http://www.dtcms.com/a/355913.html

相关文章:

  • 告别低效!三坐标测量机提高油缸导向套检测效率
  • 拷贝构造和赋值重载有什么区别
  • 转发、重定向
  • 什么是强化学习? ——— 帮助新手了解
  • 基于51单片机的远程wifi浇花系统设计
  • Snagit 2025.3.0 截图贴图录像编辑
  • Android Keystore签名文件详解与安全防护
  • shell编程学习
  • 基于深度学习的档案级图像修复:Coderformer AI技术解析与应用实践
  • 一、晶振与布局布线处理
  • Python Imaging Library (PIL) 全面指南:Python Imaging Library (PIL)基础图像处理入门
  • 呼叫中心录音加密与数据隔离技术方案全解析
  • Wagtail 扩展 HomePage 模型(一个简单的 例子)
  • 人工智能-python-深度学习-过拟合与欠拟合:概念、判断与解决方法
  • 鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(三)
  • 详解多智能体架构:以 Open Deep Research 项目为例
  • Android中设置RecyclerView滑动到指定条目位置
  • container向harbor推送镜像报错 x509: certificate signed by unknown authority
  • redis添加超时设置
  • SONiC 之 Testbed(2)Ansible
  • Ansible 角色与 Galaxy 生态:角色复用、集合安装与系统角色配置详解
  • 半导体全自动化无人工厂应用
  • Zigbee与LoRaWAN物联网协议深度对比与技术选型指南
  • 激活函数学习
  • FIO的使用教程
  • 数据结构---链表操作技巧
  • 关于PCB面试问题
  • 01.<<基础入门:了解网络的基本概念>>
  • 大模型微调示例三之Llama-Factory_Lora
  • 机器学习和高性能计算中常用的几种浮点数精度