困难。
贪心,贪心,贪心!
我们对于序列建出笛卡尔树,考虑在笛卡尔树上贪心。
对于一个点,他的两个儿子是凸出来的两块,我们考虑先把他们搭完,把剩下的留在底下继续搭。
复杂度是优美的 O(n)
才知道主席树也能区间加
考虑处理出每个点 i 能扩展到的最远点 nxt(i) , 知道这个之后我们在主席树上进行若干次区间加法,最后询问左端点在 [l,r] 之间的区间和即可。
需要用到标记永久化的处理技巧。
对于 nxt(i) 的处理还是要用到二分。
考虑如何判断区间 [l,r] 是否合法。
我们维护一个前缀和, s(0/1,i,j) 表示 前 i 个数,第 j 位为最高位 0→1
的次数, 同理维护一个 1→0 的次数,二分判断这一段区间这个是否为 0 即可。
预处理复杂度是两只 log , 查询是一只 log
第三次学.jpg
求 gcd(afn+bfn+1,cfn+dfn+1) ,其中 fn=9fn−1+12fn−2
通过打表可以发现 gcd(fn,fn−1)=32n
首先我们通过辗转相减,可以把 dfn+1 这一项消去,只需要考虑 gcd(afn+bfn+1,cfn) 其中 a, b, c 每次都有所变化。
考虑没有 c 这个东西会怎么样呢?
gcd(afn+bfn+1,fn) = gcd(bfn+1,fn)
通过我们打的表可以看出他就是
32ngcd(b,fn) 啦
只需要在 mod b 意义下做矩阵快速幂就好了。
在有 c 的情况下,我们考虑有 g=gcd(afn+bfn+1,fn)
我们就可以把原式做一些等价变化。
gcd(afn+bfn+1,cfn)=g∗gcd(gafn+bfn+1,cgfn)=g∗gcd(gafn+bfn+1,c)=g∗gcd(gafn+bfn+1(mod gc),c)
看起来就可以了。
最后要求的是 32nfn
我们可以让转移矩阵 A 平方后 除 3
做 2n 次运算即可。
即 32nx=(3x2)2n