省选模拟50 题解
A. 小A的树
超级钢琴、异或粽子、异或之几道题都是这个套路。
对于每个右端点不断找区间最优解,然后把原区间分割为两个区间。
用一个堆来时刻找到最大值。
所以这个题要解决的就是一个点和区间内所有点的最大距离。
点集合并的问题,直接搞一个线段树维护直径就好了。
B. 小B的序列
考虑位运算的一些性质,可以按位考虑。
对于每一位而言,如果区间不同,执行 $or\ 1$ 或者 $and\ 0$ 操作之后,会使整个区间相同。
所以说这个操作实际上意味着区间推平。
当线段树区间内存在一个位满足当前不平,并且可以被该操作推平,那么就暴力递归下去。
是否存在的判断可以直接通过维护区间的 $or$ 和 $and$ 然后用位运算实现。
否则直接打一个标记来表示给区间整体执行 $or$ 和 $and$ 的操作。
对二进制下的每一位势能分析一下,可以得知复杂度是两个 $log$ 的。
所以问题是咋维护两个标记,来表示给区间执行 $or$ 和 $and$ 操作。
可以钦定一个顺序,对区间内操作执行先 $and$ 后 $or$。
那么$a \ and \ b \ or \ c \ or \ d =a \ and \ b \ or \ (c \ or \ d)$
$a \ and \ b \ or \ c \ and \ d = a \ and \ (b \ and \ d) \ or \ (c \ and \ d)$
然后再维护一下最大值支持查询就好了。
C. 小C的利是
首先要想到原问题可以用行列式来解决。
因为行列式的定义就是枚举一个排列,然后贡献为权值的乘积 $*(-1)^{num}$。
因为有个加法,所以把它提到指数上去,构造一个多项式就好了。
因为有个 $(-1)^{num}$ 的系数,为了防止被卡需要再给每个多项式随机乘个系数。
发现最终的答案显然不超过 $nk$ 次,所以暴力求值插值,复杂度大概是五次方级别的。
然后发现我们只关注 $k$ 的倍数次方处是否有值,也差不多可以转化为 $k$ 的倍数次方的系数和。
所以可以套个单位根反演上去。
这样的话只要找出一个存在 $k$ 次单位根的质数来,然后在这个模质数意义下分别代入 $x=w_k^i$ $0 \leq i < k$ 来求行列式的和。
最终得到的答案就是 $k$ 的倍数次方的系数和。
如果说这个值不为 $0$ ,即一定存在一组合法解,否则大概率无解。