A. 小A的树
看到前k大很容易想到类似超级钢琴那样的做法。
所以问题就转化成了给定一个点和一个区间,求点到这个区间中的点的最远路径。这个东西可以用直径合并简单的维护出来,也就是用线段树维护每个区间的直径。
然后用一个堆来维护当前的最优决策,不断取出堆顶并且更新即可。
B. 小B的序列
看到只有or和and应该就能想到势能线段树了,但是考场上一直不知道怎么维护这个标记,然后就死掉了。
实际上还是维护标记的套路,也就是强制先下传and再下传or,然后考虑每次操作对于标记的影响就可以了。
然后对于每次操作,假如当前修改的操作对于整个区间的贡献是相同的,那么可以直接打标记,因为此时可以知道新的最值。
否则暴力向下递归到需要修改的节点。
根据势能分析可以知道复杂度是正确的。
C. 小C的利是
枚举排列的题可以想一想行列式。
因为行列式的加法比较难搞所以提到指数上,这样就构造了一个多项式。为了防止被卡,可以给系数乘上一个随机数。
然后发现我们只关注k的倍数处的系数,所以考虑搞个单位根反演。
然后将各个单位根代进去,将行列式相加,就可以得到k的倍数处的系数。
然后判断这个系数是不是0即可。