省选2021题解

P7514 [省选联考 2021 A/B 卷] 卡牌游戏

毒瘤出题人
首先枚举最小值
然后二分最大值,我们要把所有小于最小值的和大于最大值的都换掉,换掉的时候要判断一下合不合法
当然可以双指针做到 \(\mathcal O(n)\)
但是这题数据反正怎么写都能过。

P7515 [省选联考 2021 A 卷] 矩阵游戏

观察发现我们的矩阵的第一行和第一列如果确定了,那么整个矩阵就相应地确定了
所以不妨我们可以设这个矩阵的第一行和第一列都是 \(0\),这样我们可以构造出一组不满足 \(0\sim 10^6\) 的限制的一组解
接下来观察发现,我们在一行的每一个奇数列都 \(+x\),在一行的每一个偶数列都 \(-x\),答案是不会发生任何变化的
同样对于每一列,这个性质也是成立的
所以我们可以想到差分约束
但是这样我们的一些位置是 \(c_i+r_j+a_{i,j}\),这样是不能差分约束的
所以我们把每个 \(r_i\) 在相应位置的符号调换一下,这样每个位置都可以差分约束了

code

P7516 [省选联考 2021 A/B 卷] 图函数

自然的想法是倒序加边,变成插入的问题
显然一对 \(u,v\) 能够对答案产生贡献,必须要满足 \(u\geq v\)
并且必须要满足存在一条 \(u\to v\)\(v\to u\) 的路径,使得经过的点都不超过 \(v\)
我们考虑在加入哪一条边的时候 \(u,v\) 能够产生贡献,只需要最后做一下差分就可以了
我们维护 \(g[i][j]\) 表示从 \(i\) 走到 \(j\),经过的点都不超过 \(j\) 的经过的边的最小编号的最大值
转移的方式就类似一个 floyd 的过程
我们从大到小枚举转移点 \(k\)
如果 \(i>k\),那么我们的 \(j\) 就要满足 \(j\leq k\),但是如果 \(i\leq k\),我们的 \(j\) 就没有限制了,直接转移就可以了,因为这样我们经过的点一定都比 \(\min\{i,j\}\) 要大。
\(\mathcal O(n^3)\)

code

P7518 [省选联考 2021 A/B 卷] 宝石

送我退役的一道题。
被原题埋伏了。
我们发现,每个位置的下一个位置是确定了,我们预处理出一个点往他的父节点往前走的link,和往后走的link
这样可以建立出两张拓扑图,在拓扑图上预处理出倍增数组。
接下来对于每次询问,我们二分他取了多少个,那么从 \(x\to lca\) 的部分是非常好解决的,但是从 \(t\) 往上的最近的颜色 \(c\) 的位置我们不好搞
所以我们把所有的询问挂在 \(y\) 上,这样的话我们 dfs 到 \(y\) 就可以直接走到最近的 \(c\) 的位置了

\(\mathcal O(n\log^2 n)\)

code

P7519 [省选联考 2021 A/B 卷] 滚榜

看到数据范围一眼状压 dp
我们发现我们只需要给每个位置安排最少的题数,把多余的全部给丢给最后一个队就好了
\(f[S][i][k]\) 表示已经公布的集合为 \(S\),上一个公布的人为 \(i\),一共已经使用的 \(k\) 道题。
但是我们发现我们只要在这里选了 \(x\) 首,那么后面的每一首都需要多选上 \(x\) 首,所以我们直接把剩下的每个人都选上,也就是把贡献提前就可以了
注意最开始的预处理,我们需要用最开始最大的来更新

\(\mathcal O(2^nnm)\)

code

P7520 [省选联考 2021 A 卷] 支配

考虑建出一棵支配树
考虑加入一条边的时候,显然每个点的被支配集只会变小不会增大
那么如果存在 \(1\to x,y\to u\) 的路径,并且他没有经过 \(u\) 在支配树上的父节点,那么 \(u\) 就是会发生变化的
考虑首先建出一棵支配树,这里可以采用 \(\mathcal O(n^2)\) 的建法,先求出每个点的支配集,然后类似拓扑排序的方法,从 \(1\) 开始删,每次把被支配的点数只剩下他自己的推进队列,当前点就是他在支配树上的父节点
对于每个点,我们删除它的父节点,看存不存在 \(1\to x,x\to y\) 的路径,如果可以,那么他和它的子树里的每一个点都会更改,最后做一下标记下传就可以了

\(\mathcal O(n^2)\)

code

P7521 [省选联考 2021 B 卷] 取模

考虑枚举 \(a_k\)
这样我们会生成一个新的序列 \(b\),我们按照从小到大排序
对答案产生贡献的一共有两类,一类是和没有超过 \(a_k\) 的,另一类是超过的,对于没有超过的,我们枚举 \(a_i\),二分查找最优的 \(a_j\),对于超过的,我们只需要对于 \(b\) 中的最大值和次大值求和就可以了。
这样做的复杂度是 \(\mathcal O(n^2\log n)\)

然后考虑一个非常靠谱的优化,我们从大到小枚举 \(a_k\),如果当前的答案比 \(a_k\) 要大,直接输出答案就可以了
我们可以感性理解一下发现这个东西下降的速度非常快,所以可以可以认为是 \(\mathcal O(kn\log n)\)
实际上网上有证明 \(k=\mathcal O(\log V)\),但是并不会证明

code

posted @ 2021-04-28 19:23  YuukiYumesaki  阅读(160)  评论(0编辑  收藏  举报