2020.11.02【NOIP提高A组】模拟
GMOJ 2020.11.02提高组模拟
T1.6843移形换影
一道十分简单的模拟题,但是我的做法比较复杂,考场打+调了 \(1h\) 呜。
首先 \(0\) 与 \(2\) 的位置是不可调换的。考虑贪心地从左往右做:
1.当前位为 \(0\),字典序一定最小,跳过
2.当前位为 \(1\),往后找到最近的 \(0\) 并将其移到当前位前,要求 \(0\) 是最近的且与当前位之间没有 \(2\) 且剩余操作次数足够
3.当前位为 \(2\),往后找到最近的 \(1\) 并将其移到当前位前,要求操作次数足够
链表维护即可。
T2.6844旅途和生活
由数据范围提示可得:可以证明,若 \(a\), \(b\) 同为奇数,对于任意 \(n\) 对应的答案在取模前可以用 long long 保存。
所以对于 \(a\), \(b\) 同为奇数的情况,只需计算出 \(a^n - b^n\) 二进制下后63位(也就是 \(mod\) \(2^{63}\)),直接快速幂计算答案,可用 \(unsigned\) \(long\) \(long\) 避免高精度。
十分显然的是, 若 \(a\), \(b\) 奇偶性不同,则答案为 1。
对于 \(a\), \(b\) 为偶数,只需提出 \(2^c\) 使得 \(\frac{a}{2^c}\), \(\frac{b}{2^c}\) 中至少一个为奇数,分上面两种情况计算答案,最后乘回 \(2^c\)。
T3.6845梯度弥散
看到数据范围 \(c = 0, 1, 2\) 就知道这一题是给人做的。
首先可以贪心地从左往右一位一位满足条件,所以考虑二分答案。
对于 \(c = 0\),发现每次都是给一段连续的区间加上一个相同的数值,直接差分。
对于 \(c = 1\),每次都是给一段连续的区间加上一个公差为 -1 的等差数列,差分公差,对于每一位需加上的值前缀和维护。
对于 \(c = 2\),发现 \((x + 1)^2 - x^2\) 构成一个公差为 -2 的等差数列,按 \(c = 1\) 的方法维护等差数列,再计算出 \(x^2\) 即可。
一波套娃行为打得有点头晕,注意题面规定 \(0^0 = 1\),考场因此炸了 \(10\) 分差评!
T4.旅人1970
很遗憾考场没时间想了,拿到的 \(4\) 分的好成绩。
结论 \(1\) :
若确定 \(i\) 为莫个划分集最小众数,则包含 \(i\) 的划分集有且只有一个。
证明 :
若有多个划分集众数为 \(i\),那么将其合并答案更小;若 \(i\) 在某个最小众数不为 \(i\) 的划分集中,那么将 \(i\) 提出来也不影响答案。
结论 \(2\) :
一个划分方案合法当且仅当众数的 \(a_i\) 之和不小于最大的 \(a_i\)。
结论 \(2\) 应该比较显然,有了结论 \(2\),我们就可以得出一个 \(O(nq)\) 的做法,每次选取一段最小前缀使得前缀和不小于 \(v\)(\(v\) 表示最大的 \(a_i\)),然后从大到小地删除前缀中的数:如果前缀和减去 \(a_i\) 仍满足条件,那么就删去 \(i\),(比较显然的 \(2^i > \sum\limits_{j = 0}^{i - 1}{2^j}\),所以可以从大到小贪心地删)
满分还有个结论 \(3\) 暂时没看懂唔,但做法总的来说就是在线段树上暴力寻找删除区间

浙公网安备 33010602011771号