省选模拟74 题解

A. 签到

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

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

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

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

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

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

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

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

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

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

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

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

最后给答案减去 230 即可。

 

B. 树(tree)

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

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

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

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

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

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

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

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

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

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

 

C. 区间(interval)

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

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

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

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

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

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

posted @   skyh  阅读(132)  评论(1编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示
主题色彩