Skip to content
0

前言

  • zsq 真是一道原题都不放...

  • 测试做对了最没意义的 4 道,zsq 表示最有意义的一道没做(罚站)。


题目

前缀和(有意义的题...)

题目描述(很抽象)

给一个有一个长度为 n 的数组 a

数组 a 的前缀和定义为 si=j=1iaj (对于所有的 1in),规定 s0=0

数组 a的前缀和的前缀最大值为 maxi=maxj=0isj (对于所有的 1in)。

数组 a1 类和谐度为 maxi 中不同的元素数量。

数组 a2 类和谐度为所有 a 的所有排列中 1 类和谐度的种类数。

现在有一个长度为 n 的数组 b

给出 q 个询问,每个询问包含两个整数 l,r,求bl,bl+1,bl+2,,br2 类和谐度为多少。

Solution

需要一个很重要的技巧:求某种属性的种类数可以用上限减去下限

有个细节的突破点 s0=0,这里就给我们提示了,1 类和谐度中的 maxi0,那么这里的上限就是把区间内的正数放在前面,负数放在后面;下限反过来即可。

我们还需要证明上下限之间的种类数都可以构造出来:

很简单,我们只需要把前面的 k 正数放在负数后面,种类数就会减 k,这是显而易见的。


小白逛公园

Solution

线段树合并的板子题。

定义每个节点 rt 表示的区间 [l,r] 上有 sum,maxx,lmax,rmax 分别表示区间 [l,r] 中所有值的和,最大子段和,以 l 为左端点的最大子段和和以 r 为右端点的最大子段和。

那么易得(画个图就很好理解了):

rtsum=lsonsum+rsonsum

rtlmax=max(lsonlmax,lsonsum+rsonlmax)

rtrmax=max(rsonrmax,rsonsum+lsonrmax)

rtmaxx=max(lsonmaxx,rsonmaxx,lsonrmax+rsonlmax)

最近更新