10.3 - AM - 模拟赛 总结
复盘
T1 很水,一道异或求和,但是某两位仁兄因没打括号而死。
T2 很水,一道字符串处理,但是我和某位仁兄因没特判而死(虽然没有 hack 掉我,所以我理论上还是满分)。
T3 不水,看了很久,没想出来,自闭了就去看了 T4。
发现也做不出来。
此时我出去晃了一圈,大概是不知道从哪里看到了一个“二”字,顿悟。
跑回教室打了一个二分套 dp,过了大样例就磕 T4。
时间剩的不多了,就打了一个 \(n^2\) 的 \(40\) 分暴力就交了。
- 预估:\(100 + 100 + 100 + 40 = 340\),非常爽!
- 实际:\(100 + 100 + 90 + 40 = 330\),还是非常爽!
优点
- 只挂了 \(10\) 分。
- T2 被 hack 了但是没挂分。
缺点
- 居然挂了 \(10\) 分?!
- T2 居然被 hack 了?!
题解
T1 异或
题意
一个长为 \(n\) 的数列,将其中一个数异或 \(k\),求更改后的最大和。
题解
按题意模拟即可。
不过位运算要打括号哦~
T2 数字转换
题意
对于一个数 \(n\),可以将每一位增加 \(1\) (无限次)或任意一位加 \(1\) (一次)
题解
模拟
T3 最优除法
题意
将一个数除以 \(i\) 的代价为 \(a_i\),求 \(x\) 变到小于 \(y\) 的最小代价。
题解
(思路来自 banned_xiejiayun,加上我的一些改编,侵删)
假设:
但是我们想要由 \(32\) 到 \(4\),此时不能直接除以 \(8\),可以除以两个 \(4\),用 \(20\) 来代替 \(10^9\) 的高昂代价。
故:
但是因为我们可以用除以更大的数来代替小数(如果大数的代价小于小数):
T4 字符串
题意
求一个字符串的子串个数,满足所有出现的字符至少有一个出现次数为 \(1\)。
题解
我们记 \(f_{i, j}\) 为 \(i\) 及之前第一个为 \(j\) 的位置。
先枚举 \(i\),接着我们需要计算右端点为 \(i\) 的区间个数。
对于任意一个字符 \(j\),左端点在 \(\left[f_{i, j} + 1, i - 1\right]\) 范围内的子串一定是不包含任何 \(j\) 字符的。
同理 \(\left[f_{f_{i, j} - 1, j} + 1, f_{i, j}\right]\) 一定只包含一个 \(j\) 字符(因为 \(f_{i, j}\) 的定义包含 \(i\),所以要减一)。
但是直接计算和可能会算重复。
所以排序贪心即可。

浙公网安备 33010602011771号