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 > sumlimits_{j = 0}^{i - 1}{2^j}),所以可以从大到小贪心地删)
满分还有个结论 (3) 暂时没看懂唔,但做法总的来说就是在线段树上暴力寻找删除区间