省选模拟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$ ,即一定存在一组合法解,否则大概率无解。

posted @ 2020-03-20 17:46  skyh  阅读(205)  评论(4编辑  收藏  举报