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=1∑nj=i∑nj−i+1∑k=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=1∑nj=i∑nk=i∑jak>(j−i+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=i∑jak可以用前缀和来优化。
设
s
i
s_i
si表示
∑
i
=
1
n
a
i
\begin{aligned}\sum_{i=1}^{n}{a_i}\end{aligned}
i=1∑nai,则
∑
k
=
i
j
a
k
\begin{aligned}\sum_{k=i}^{j}{a_k}\end{aligned}
k=i∑jak等于
s
j
−
s
i
−
1
s_j-s_{i-1}
sj−si−1。
所以算法
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=1∑nj=i∑nsj−si−1>(j−i+1)×A。
我们不用每一次循环求
s
i
s_i
si,而是可以直接递推求得:
s
i
=
s
i
−
1
+
a
i
s_i=s_{i-1}+a_i
si=si−1+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=ai−A,
s
i
=
∑
i
=
1
n
b
i
\begin{aligned}s_i=\sum_{i=1}^{n}{b_i}\end{aligned}
si=i=1∑nbi,则我们只需要看一下有多少个区间的和大于
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=1∑nj=i∑nsj−si−1>0。
可以用递推预处理出
s
i
s_i
si,可得
s
i
=
s
i
−
1
+
a
i
−
A
s_i=s_{i-1}+a_i-A
si=si−1+ai−A,
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),可以过。