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,加上我的一些改编,侵删)

假设:

\[b_8 = 10^9 \]

\[b_4 = 10 \]

\[b_2 = 10 \]

但是我们想要由 \(32\)\(4\),此时不能直接除以 \(8\),可以除以两个 \(4\),用 \(20\) 来代替 \(10^9\) 的高昂代价。

故:

\[b_{x \times y} = \min\{b_{x \times y}, b_x + b_y\} \]

但是因为我们可以用除以更大的数来代替小数(如果大数的代价小于小数):

\[b_{x - 1} = \min\{b_{x - 1}, b_x\} \]

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\),所以要减一)。

但是直接计算和可能会算重复。

所以排序贪心即可。

posted @ 2024-10-03 23:13  Reveriean  阅读(16)  评论(0)    收藏  举报