10.03 模拟赛 by FXT
10.03 模拟赛
这场可能称为 CSP 模拟赛更好一点。?
T1
Ptz 2020 Winter Day 4 B QOJ 686
Solution
签到题。对于每只虱子分开考虑。
1 |
|
T2
Ptz 2020 Winter Day 4 C QOJ 687
原来 $2^nn^2$ 在 $n=20$ 是 $4\times 10^8$,我算成 $4\times 10^7$ 然后自信离场。
Solution
考虑状态压缩。令 $f_S$ 表示集合 $S$ 为前缀的拓扑序的方案数,$g_S$ 表示集合 $S$ 为后缀的拓扑序的方案数。两者都可以 $O(2^nn)$ 预处理出来。
然后是统计答案。外层枚举第 $i$ 行,令 $T=C_U^{S\cup i}$ 先判断 $S+i+T$ 是否合法,然后让 $Ans_{x,i}\gets Ans_{x,i}+f_S\times g_S$。直接做是 $O(2^n n^2)$ 的。考虑用一个类似于懒惰标记的东西。令 $h_S$ 表示 $S$ 的方案数。如果 $S$ 中包含至少两个元素,令 $x$ 为其任意的一个元素,则 $T=C_S^$ 则有 $h_x\gets h_S,h_{T}\gets h_S$。这样直接传下来,复杂度就是 $O(2^n n)$。
1 |
|
T3
JOI Open 2018 T1 Bubble Sort 2 QOJ 2643
妙妙题。
Solution
首先答案具有单调性。
原式:
$$
\min\limits_{i=l}^r a_i+\max\limits_{i=l}^r a_i>r-l+1
$$
考虑一个满足要求的区间 $[l,r]$,随便减去不是最大值的端点,则左式不减,右式减小。一定满足。
考虑一种双指针,枚举右端点 $r$,令当前的最大值为 $ans$,则 $l$ 从 $r-ans+1$ 开始向左枚举,判断合法性。
先不考虑判断合法性的复杂度。先考虑正确性。如果枚举到答案区间的最大值,则左端点根据单调性一定会移动答案区间的左端点。
然后来看端点的移动次数,每次为了保证区间的长度大于等于最大值,每次移动右端点时,左端点最多往右移动一格。左端点最多只能向左移动 $O(2n)$ 次,所以移动次数为 $O(n)$ 的。
现在的复杂度瓶颈在于判断区间的合法性。也就是要动态求出区间的最大值和最小值。除了四毛子树这种不可能写的东西以外。有一种神奇的东西:对顶栈。他的算法流程如下:
- 以一个点为中心,维护前后缀的最大最小值。
- 如果加减前后首位且区间包含中心点,$O(1)$ 维护前后缀。
- 如果不包含中心点,暴力重构,取当前区间的中点作为中心点。
考虑分析复杂度,如果一个长度为 $n$ 的序列被重构了,则至少操作了 $n/2$ 次。所以复杂度是 $O(n)$,其中 $n$ 为操作次数。
对顶栈感觉可以适用于这种双指针强行让你 $O(n)$ 的题目中。如果预处理或者查询有一个可以做到 $O(n\log n)$ 或者以上,就没有使用的必要了,感觉不如 ST 表。
1 |
|
T4
Ptz 2022 Winter Day 1 F QOJ 2544
Solution
本质上就是一个体积很大 $10^{14}$,权值只有 $0\le w\le 4$ 的 01 背包。
一种做法是将权值相同的内部体积从小到大排序。考虑权值为 $i$ 的向 $i+1$ 的转移,有决策单调性。分治 $O(wn\log n)$ 解决。
另一种做法是根据权值的特殊性,$2,4$ 分为一组合并,$1,3$ 分为一组合并,最后双指针或者三分之类的找答案。
考场贪心代码,其实很优,直接过了,要卡还是能卡,但是意义不大,不贴了。