前言
只闻花香,不谈悲喜。饮茶颂书,不争朝夕。
对 BZ 的题目彻底失望了,开始自己瞎搞了。
1. CF2057E2
标签:\(\textbf{Floyd}\)。
首先先考虑朴素做法。考虑每次询问二分答案,边权比 \(\text{mid}\) 小的边当作 \(0\),否则当作 \(1\)。如果 \(a\to b\) 的最短路 \(\le k\),那么就是合法的,否则就是不合法的,然后继续二分即可。
我们发现,只考虑边权为 \(0\) 的边,会形成若干个连通块,每个连通块内部的点可以缩成一个点(因为里面的点两两距离都是 \(0\),所以可以看成同一个点)然后再算距离。进一步的,对于每个连通块内部的边权为 \(0\) 的边,实际上我们只需要保留在原图最小生成树上的边即可。(因为我们只关心连通性)
由于最小生成树上只有 \(n-1\) 条边,也就是说,二分的答案本质上只有 \(\mathcal{O}(n)\) 种,故我们可以考虑在询问之前预处理出在这 \(n\) 种答案下任意两个点的最短路。(可以认为是一个每次使用 \(\mathcal{O}(n^2)\) 时间复杂度插入一条边的 \(\text{Floyd}\) 来实现。)
故总时间复杂度 \(\mathcal{O}(n^3+q\log n)\)。
\(\texttt{Code}\)
2. CF2057G
标签:构造。
感觉挺精妙的一个构造,反正我是没有想到的。
首先,如果我们能构造出五种方案,他们的 \(|S|\) 的和为 \(s+p\),那么必然存在一种方案满足 \(|S|\le \frac{s+p}{5}\)。
考虑如何去构造这样的五种方案。(说实话,为啥要这么想啊,头一次见这样的技巧。。)
题解告诉我们:
如果能将所有点染上五种颜色,使得任何一个点的邻域和自己恰好为这五种颜色,那么对于每种颜色 \(i\),取 \(S\) 为所有颜色为 \(i\) 的
#
格子,以及不被上述任何一个格子覆盖或相邻的#
格。后者只会出现在边界上,且边界外对应的格子恰好是颜色 \(i\)。
显然,这五种方案的 \(S\) 之和都是 \(s+p\)。
可以发现,如果 \(\text{col}_{i,j}\equiv 2\times j+i \pmod 5\)。
然后直接构造即可。
\(\texttt{Code}\)
3. CF2048G
标签:组合数学,容斥。
题目中给定的矩阵合法条件,等价于:存在一个 \((i,j)\),满足 \(a_{i,j}\) 是这一列上的最小值,且是这一行的最大值。
然后发现,如果我们去枚举 \((i,j)\) 和 \(a_{i,j}\) 的值暴力计算的话,是会算重的。
简单分析一下,算重的情况是因为存在了多个 \((i,j)\),满足了既是列最小值又是行最大值的条件,所以被计算了多次。并且,这样的方案中,满足条件的点对 \((i,j)\) 必然构成了一个 \(n'\times m'\) 的方格。(当然,不一定是连续的)
故我们考虑容斥,即枚举 \(n',m'\),然后再枚举满足条件的 \((i,j)\) 的 \(a_{i,j}\) 的值 \(a\),那么有(下文为了方便就用 \(i,j\) 表示了):
我们发现 \(m\) 的值非常大,于是考虑对于括号里面的运算观察是否能快速进行。
然后由二项式定理,我们可以直接省掉对于 \(m\) 的枚举:
然后将 \(\text{now}\) 带回原式,我们就成功通过了。
时间复杂度 \(\mathcal{O}(n\times v\times \log m)\)。
\(\texttt{Code}\)