省选模拟74 题解

A. 签到

如果权值在边上,那么问题就简单了,弄一棵生成树,然后对每个环权值塞线性基里就完事了。

但是如果权值在点上,这个结论就并不成立了。

所以可以联想+手玩发现,如果走一条路径然后回来,造成的贡献是两个端点分别状态取反,中间路径不变。

然后可以得到一种构造方法,首先从起点走到终点,然后从一条不相交的路径走回起点,然后从原来的路径走回终点。

这样就发现,问题的规模缩小了 $1$。不断重复上述过程,可以发现

当 $n+m$ 为奇数,最终到达了终点,并且图中没有任何一个点有贡献。

当 $n+m$ 为偶数,最终到达的终点,并且图中仅终点有贡献。

然后就容易发现有贡献的点的个数的奇偶性等于 $n+m-1$ 的奇偶性。

然后对于任何一个满足奇偶性的方案,都可以通过不断在终点和有贡献的点之间移动来构造出来。

所以问题就是求满足奇偶性的最大异或和,大概可以想到用线性基解决,但是太菜了不会做。

所以题解是这样的,给每个数都加上 $2^{30}$ ,于是选择个数的奇偶性就等于 $2^{30}$ 是否存在。

所以在进行线性基取最大值之前,根据要求的东西,设置初值为 $0/2^{30}$ ,使答案满足性质。

最后给答案减去 $2^{30}$ 即可。

B. 树(tree)

容易想到整个分块暴力。所以只要预处理一个数组 $f_{i,j}$ 表示第 $i$ 个块中的点与 $j$ 距离的最小值。

然后对于整块直接用数组,小的部分暴力就行了。

对于数组的处理,可以枚举块,然后问题就是多源点最短路,而且是树上的形式,写个换根 $dp$ 就行了。

然后本题的正解是个类似线段树分治的东西。

具体来说,离线询问,然后对于每个询问,都像线段树一样塞入 $log$ 个区间中。

最后扫一遍分治结构,对于每个节点,都把节点管辖的区间、每个询问点建出一棵虚树来,在虚树上写一个上述换根 $dp$ 就好了。

然后另外一个做法是弄个点分治。

具体来说,在点分治结构的 $lca$ 处考虑每个点对的贡献。

在分治中心扫所有的儿子,并把对应的权值塞进一个线段树里。

然后对于每个子孙节点中的询问,都在线段树中查询一遍即可。

C. 区间(interval)

其实就是给暴力算法加个 bitset 优化。

就是说分块然后弄个 bitset 来搞。

但是这样的话两个 bitset 的合并是非常困难的,一次的复杂度就是 $O(frac{n}{w})$,所以对于一个询问也就只能做一两次。

然后就是一个与解决随机数据下 $O(n)~O(1)$ RMQ 问题的算法差不多的算法,在分块的基础上再弄个 ST 表。

所以每次只需要合并两个 bitset,就可以解决了。

然后一个优化是对于出现次数小于 $1$ 的权值,可以单独拎出来考虑贡献,所以值域范围可以缩减到 $5*10^4$,就可以不卡常跑过了。 

原文地址:https://www.cnblogs.com/skyh/p/12727019.html