首页 > 其他 > 详细

牛牛的滑动窗口

时间:2021-08-30 03:22:36      阅读:13      评论:0      收藏:0      [点我收藏+]

题面

链接:https://ac.nowcoder.com/acm/contest/7604/D

牛牛最近学习了滑动窗口类的算法,滑动窗口算法可以解决一些线性数组的离线静态区间查询类问题。

具体来说,假设对于一个数组进行m次静态区间查询问题。如果这些查询满足条件:\(\forall i,j\)\(l_i\le l_j\)时,一定满足\(r_i\le r_j\)(i,j表示查询的编号,l,r表示查询的左右端点)

接下来只要查询的问题满足可以快速插入和删除单点,就可以使用滑动窗口优化,将这m次查询的复杂度降低到O(n)。

牛牛接下来想要问你的问题也和定长滑动窗口有关。

众所周知,长度为k的滑动窗口从左到右去截取一个长度大小为n的数组时,一共可以截取到n-k+1个子数组。

牛牛将这n-k+1个子数组的极大值与极小值的乘积求和称为该数组的"第k窗口值"。

技术分享图片

举个例子,假设长度为5的数组为[1,5,2,4,3],长度为3的滑动窗口可以截取三个子数组,它们分别为[1,5,2],[5,2,4],[2,4,3]。

所以该数组的“第3窗口值”为1*5+2*5+2*4=23。

对于一个给定大小的数组n,牛牛现在想要知道它的第1,2,3,4,5...n窗口值各是多少,请你编写程序解决他的问题。

\(1\le n\le 10^5,1\le a_i \le 10^2\)

解法

首先转变思路,从求每个窗口值转成每种贡献值能影响多少个窗口。由于\(a_i\)很小,能取到的贡献也很小,所以方案是可行的。

牛牛的滑动窗口

原文:https://www.cnblogs.com/dai-se-can-tian/p/15196501.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!