省选模拟50

A. 小A的树

  看到前k大很容易想到类似超级钢琴那样的做法。

  所以问题就转化成了给定一个点和一个区间,求点到这个区间中的点的最远路径。这个东西可以用直径合并简单的维护出来,也就是用线段树维护每个区间的直径。

  然后用一个堆来维护当前的最优决策,不断取出堆顶并且更新即可。

B. 小B的序列

  看到只有or和and应该就能想到势能线段树了,但是考场上一直不知道怎么维护这个标记,然后就死掉了。

  实际上还是维护标记的套路,也就是强制先下传and再下传or,然后考虑每次操作对于标记的影响就可以了。

  然后对于每次操作,假如当前修改的操作对于整个区间的贡献是相同的,那么可以直接打标记,因为此时可以知道新的最值。

  否则暴力向下递归到需要修改的节点。

  根据势能分析可以知道复杂度是正确的。

C. 小C的利是

  枚举排列的题可以想一想行列式。

  因为行列式的加法比较难搞所以提到指数上,这样就构造了一个多项式。为了防止被卡,可以给系数乘上一个随机数。

  然后发现我们只关注k的倍数处的系数,所以考虑搞个单位根反演。

  然后将各个单位根代进去,将行列式相加,就可以得到k的倍数处的系数。

  然后判断这个系数是不是0即可。

posted @ 2020-03-20 21:50  tdcp  阅读(133)  评论(0编辑  收藏  举报