本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/p/16565280.html

2022.8.9模拟赛简要题解

A

做个最小生成树,每当某个并查集与1所在并查集相连的时候,就用当前边乘上这个并查集大小

B

显然前缀并查集。每次把 x1x-1yy 并起来,两个点加入在同一个并查集里面说明它们之间的异或和已定

判断是否合法要维护当前点到祖先的异或值,两点到祖先的异或和相当于就是两数之间的异或和

实现过程对并查集进行一些小改动即可

C

由于 n105n\leq 10^5,考虑根号做法,尝试对 kk 进行根号分治

  • 如果 knk\leq \sqrt n,这样的 kk 必然不超过 n\sqrt n 个,可以预处理,复杂度 O(nn)O(n\sqrt n)
  • 如果 knk\geq \sqrt n,这种情况下最多跳 n\sqrt n 步就结束,直接暴力模拟,复杂度 O(nn)O(n\sqrt n)

总复杂度 O(nn)O(n\sqrt n)

D

考虑枚举左端点,如果左端点确定,我们把左端点前面的数的贡献都记为0,后面每个数 aia_i 如果第一次出现贡献就记为 WaiW_{a_i},第二次出现记为 Wai-W_{a_i},再后面出现记为0

此时我们就相当于在求前缀和最大值,因为每个数如果出现一次就得了 WiW_i,出现两次以上又得了 Wi-W_i,互相抵消后相当于0

我们可以拿个线段树维护,每次维护区间和和区间前缀最大值,区间前缀最大值可以是左区间前缀最大值或者是左区间之和加上右区间前缀最大值

每次直接统计总体前缀最大值,事实上线段树我们只需要写一个单点修改即可

复杂度 O(nlogn)O(n\log n)