sequence 题解

26 篇文章 0 订阅
3 篇文章 0 订阅

s e q u e n c e sequence sequence 题解

题目

这里

解题方法

算法 1 1 1

可以发现答案就是 ∑ i = 1 n ∑ j = i n ∑ k = i j a k j − i + 1 > A \begin{aligned}\sum_{i=1}^{n}{\sum_{j=i}^{n}{\frac{\sum_{k=i}^{j}{a_k}}{j-i+1}>A}}\end{aligned} i=1nj=inji+1k=ijak>A
因为除法是乘法的逆运算,所以可将上式转化为 ∑ i = 1 n ∑ j = i n ∑ k = i j a k > ( j − i + 1 ) × A \begin{aligned}\sum_{i=1}^{n}{\sum_{j=i}^{n}{\sum_{k=i}^{j}{a_k}>(j-i+1)\times A}}\end{aligned} i=1nj=ink=ijak>(ji+1)×A
因此可以直接暴力,时间复杂度为 O ( n 3 ) O(n^3) O(n3)

算法 2 2 2

对算法 1 1 1进行改进,可以发现 ∑ k = i j a k \begin{aligned}\sum_{k=i}^{j}{a_k}\end{aligned} k=ijak可以用前缀和来优化。
s i s_i si表示 ∑ i = 1 n a i \begin{aligned}\sum_{i=1}^{n}{a_i}\end{aligned} i=1nai,则 ∑ k = i j a k \begin{aligned}\sum_{k=i}^{j}{a_k}\end{aligned} k=ijak等于 s j − s i − 1 s_j-s_{i-1} sjsi1
所以算法 1 1 1的式子可以转化为 ∑ i = 1 n ∑ j = i n s j − s i − 1 > ( j − i + 1 ) × A \begin{aligned}\sum_{i=1}^{n}{\sum_{j=i}^{n}{s_j-s_{i-1}>(j-i+1)\times A}}\end{aligned} i=1nj=insjsi1>(ji+1)×A
我们不用每一次循环求 s i s_i si,而是可以直接递推求得: s i = s i − 1 + a i s_i=s_{i-1}+a_i si=si1+ai,预处理 s 0 = 0 s_0=0 s0=0
时间复杂度为 O ( n 2 ) O(n^2) O(n2),可以得 60 60 60分。

算法 3 3 3

换一种思路,注:下面的 s s s与上面的 s s s不同, a a a A A A跟上面是一样的。
b i = a i − A b_i=a_i-A bi=aiA s i = ∑ i = 1 n b i \begin{aligned}s_i=\sum_{i=1}^{n}{b_i}\end{aligned} si=i=1nbi,则我们只需要看一下有多少个区间的和大于 0 0 0即可。
也就是 ∑ i = 1 n ∑ j = i n s j − s i − 1 > 0 \begin{aligned}\sum_{i=1}^{n}{\sum_{j=i}^{n}{s_j-s_{i-1}>0}}\end{aligned} i=1nj=insjsi1>0
可以用递推预处理出 s i s_i si,可得 s i = s i − 1 + a i − A s_i=s_{i-1}+a_i-A si=si1+aiA s 0 = 0 s_0=0 s0=0
时间复杂度仍然为 O ( n 2 ) O(n^2) O(n2),但是越来越接近满分算法了。

算法 4 4 4

优化上述方法,可以用树状数组维护区间和。
首先我们将序列离散化虽然我不是很清楚什么是离散化
每一次我们求出 s i s_i si,都看一下 s i s_i si是否大于 0 0 0,如果大于,答案加 1 1 1
离散化过程如下:
我们先记录每一个的下标(用 c c c表示),初始化 c i = i c_i=i ci=i
那么我们以 s s s为第一关键字从小到大排序,以 c c c为第二关键字从大到小排序。
那么就得到了一个序列。
接着我们开始用树状数组优化。
每一次我们只用将答案加上 s u m ( c i ) sum(c_i) sum(ci)就行了,并维护—— a d d ( c i ) add(c_i) add(ci)
下面我讲一讲这些函数的用途:
s u m ( x ) sum(x) sum(x):求出所有以 x x x为根的树状数组的结点的权值总和。
a d d ( x ) add(x) add(x):表示将所有以 x x x为根的树状数组的结点的权值加 1 1 1
时间复杂度为 O ( n log ⁡ 2 n ) O(n\log_{2}^{n}) O(nlog2n),可以过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值