省选模拟62

A. Fable

  对于一个序列求出来冒泡排序k轮之后的结果。

  考虑用逆序对来搞这个东西,显然排序一轮之后某个位置的逆序对数会-1,并且向前移动一格,所以最终状态的每个位置的逆序对数可以简单得到。

  然后倒序处理就不用平衡树了,用权值线段树查询全局k大即可。

B. Fiend

  发现要求的和逆序对个数的奇偶性有关,所以不难想到行列式。

  那么不难发现就是求行列式的正负性。 直接暴力是$O(n^3)$的。

  考虑按照每列来处理,对于每一列找到左端点为这一列且右端点最小的那一行和当前行交换。然后进行消元,将所有含这一列的行全部消掉。

  这样可以发现实际上就是将这一列的所有行转移到了另一列,那么需要一种支持合并,查询最小值的数据结构,各种可并堆就可以完成。当然set启发式合并也行。

  

C. Flair

  考虑暴力求出来$max(c_i c_j)$以内的答案,然后剩余部分可以发现,若选的个数是$gcd(c_i)$的倍数那么一定没有贡献,所以我们只要在模$gcd(c_i)$的意义下考虑。

  发现在模意义下,由于多项式的长度不长,这个东西可以用生成函数简单计算,只要打一个特殊的多项式快速幂即可。

  由于模数不是质数,所以还要用MTT来计算卷积。

posted @ 2020-04-04 21:42  tdcp  阅读(121)  评论(0编辑  收藏  举报