<span>省选模拟62 题解</span>
A. Fable
虽然没打 noi online,但是大概看了一眼题。
其中 T2 就用到了一个结论是:
设 $p_{i,k}$ 表示 $i$ 次冒泡排序之后,第 $k$ 个点与之前的点形成的逆序对个数。
则有每次冒泡排序之后,$p_{i+1,k}=\max{p_{i,k+1},0}$。
证明还挺显然的,因为只要 $k$ 前面有更大的数,那就意味着交换一次,逆序对个数减少一。
如果没有,那就不减少,其实就是对 $0$ 取 $\max$。
这样的话直接求出原始逆序对,然后就求出来 $k$ 次之后的逆序对。
然后写个平衡树来插入就可以了。
另一个做法是,$k$ 轮排序最多影响左边全部,和右边相邻的 $k$ 个位置。
所以操作的实质就是每个点都不断取区间内最小的点,用堆维护即可。
B. Fiend
容易发现问题是比较逆序对个数为奇数的排列个数和逆序对个数为偶数的排列个数的大小。
然后根据逆序对、排列这两个想法,可以联想到搞一个矩阵行列式。
具体的,只要把合法区间内赋值为 $1$,其他为 $0$ 就可以了。
然后这个玩意就求出了偶排列个数-奇排列个数,这样比较与 $0$ 的大小关系就好了。
所以问题是咋做这个高斯消元。
然后神仙思路是,本题中的矩阵比较特殊,其中只有数 $1$,而且是连续的。
那么不妨给每行都弄一个 $l,r$,表示 $[l,r]$ 区间内为 $1$。
给所有的区间按照二维排序,然后每次只要对左端点取出最小的右端点,
然后把这个左端点对应的区间中,所有的左端点都右移就好了。
这样实际上这些区间都加入了另一个左端点对应的集合,所以用一个支持集合合并、查询最小值的结构就好了。
显然搞一个启发式合并 $set$ 就结束了。
C. Flair
主要的思路大概就是分析一些性质。
本题中保证了 $c_i*c_j \leq 10^4$。
考虑我们求出所有 $c_i$ 的 $\gcd$ 设为 $g$。
然后考虑每一个 $g$ 的倍数,在他很大的情况下都是可以被拼出来的。
根据 小凯的疑惑 那题的结论,如果 $g$ 为 $1$,那么最大的拼不出来的数是 $a*b-a-b$。
对于 $g>1$ ,其实除掉一个 $g$ 问题也是类似的。
所以对于 $g$ 的超过 $10^4$ 的倍数,都满足可以被拼出来,而不是 $g$ 的倍数的都无法拼出。
所以考虑小于 $10^4$ 的部分,可以暴力统计。
对于较大的部分,只关注不是 $g$ 的倍数的部分,然后对于 $mod \ g=k$,浪费的钱都是同样的。
所以构造一个 $A(x)=p*x+100-p$ 的多项式,在 $mod \ x^g$ 意义下做一个 $A^n(x)$ 就好了。