题目大意就是给出
Q
(
Q
≤
40000
)
Q(Q\le 40000)
Q(Q≤40000) 个询问,给定参数
l
1
,
r
1
,
l
2
,
r
2
l_1,r_1,l_2,r_2
l1,r1,l2,r2,询问长度
n
=
100000
n=100000
n=100000 的序列中,
∑
l
∈
[
l
1
,
r
1
]
∑
r
∈
[
l
2
,
r
2
]
(
max
i
∈
[
l
,
r
]
a
i
−
min
i
∈
[
l
,
r
]
a
i
)
\sum\limits_{l\in[l_1,r_1]}\sum\limits_{r\in[l_2, r_2]}(\max\limits_{i\in[l,r]}a_i-\min\limits_{i\in[l,r]}a_i)
l∈[l1,r1]∑r∈[l2,r2]∑(i∈[l,r]maxai−i∈[l,r]minai) 的值,允许离线。
我们可以把
r
∈
[
l
2
,
r
2
]
r\in[l_2,r_2]
r∈[l2,r2] 这个条件转化为两个前缀信息相减的形式,即
∑
r
∈
[
1
,
r
2
]
∑
l
∈
[
l
1
,
r
1
]
(
max
i
∈
[
l
,
r
]
a
i
−
min
i
∈
[
l
,
r
]
a
i
)
−
∑
r
∈
[
1
,
l
2
−
1
]
∑
l
∈
[
l
1
,
r
1
]
(
max
i
∈
[
l
,
r
]
a
i
−
min
i
∈
[
l
,
r
]
a
i
)
\sum\limits_{r\in[1, r_2]}\sum\limits_{l\in[l_1,r_1]}(\max\limits_{i\in[l,r]}a_i-\min\limits_{i\in[l,r]}a_i)-\sum\limits_{r\in[1, l_2-1]}\sum\limits_{l\in[l_1,r_1]}(\max\limits_{i\in[l,r]}a_i-\min\limits_{i\in[l,r]}a_i)
r∈[1,r2]∑l∈[l1,r1]∑(i∈[l,r]maxai−i∈[l,r]minai)−r∈[1,l2−1]∑l∈[l1,r1]∑(i∈[l,r]maxai−i∈[l,r]minai)。
然后最大最小值可以分开处理,最小值只要取反一下,就可以套用最大值的过程。
把询问离线,按顺序枚举
r
r
r,我们就能把询问转化为
∑
r
0
=
1
r
∑
l
∈
[
l
1
,
r
1
]
max
i
∈
[
l
,
r
0
]
a
i
\sum\limits_{r_0=1}^r\sum\limits_{l\in[l_1,r_1]}\max\limits_{i\in[l,r_0]}a_i
r0=1∑rl∈[l1,r1]∑i∈[l,r0]maxai 的形式。
这样总的询问数仍然是
O
(
Q
)
O(Q)
O(Q) 级别的。
我们可以考虑动态维护一个线段树,以位置为下标,然后每个位置维护这个位置到目前枚举的
r
r
r 这个区间的最大值。对于每个这样的询问,直接在线段树上查询。即离线线段树。
然后考虑我们在右端点可选集合
[
1
,
i
)
[1,i)
[1,i),中加一个
i
i
i,线段树会有什么变化:
用单调栈求出一个最小的
k
k
k 使得
max
j
∈
[
k
,
i
]
a
j
=
a
i
\max\limits_{j\in[k,i]}a_j=a_i
j∈[k,i]maxaj=ai。那么我们就要把
[
k
,
i
]
[k,i]
[k,i] 中的最大值全部改为
a
i
a_i
ai。
这样我们能够资瓷查询
∑
l
∈
[
l
1
,
r
1
]
max
i
∈
[
l
,
r
]
a
i
\sum\limits_{l\in[l_1,r_1]}\max\limits_{i\in[l,r]}a_i
l∈[l1,r1]∑i∈[l,r]maxai。