2021.7.21 校内模拟赛游记

为什么想了那么久的 T2 都不会啊 /yiw

T1

定义 \(f(n)\)\(n < 10\) 时结果是 \(n\),否则设 \(d(n)\)\(n\) 在十进制下各位数的和,求 \(x \in [l, r], f(x) = a\) 的个数。

看到题目发现所有的 \(f(x)\) 都可以化成 \(f(d(n))\), 于是就准备写数位 dp 了,可是想起以前写数位 dp 写挂的悲惨遭遇,就觉得第一题不会直接上数位 dp 的。

然后容易发现 \(f(n)\)\(1, 2, 3, \cdots 9, 1, 2, \cdots, 9, 1, \cdots\) 这样子循环的,那么就直接一个式子算出来就可以了。证明的话,首先,如果不进位那么肯定是成立的,因为数加一,和也一定加一。所以只需要考虑进位的情况,而进位前到进位后,最后的那个 \(9\) 在模 \(9\) 意义下就是 \(0\),所以还是给整个加了 \(1\)

T2

T1 半小时不到就 A 了,然后就开始了悲惨的 T2。

给定序列 \(A\),每次从中取出所有 \(x\),放到头或者尾,求最少步数使 \(A\) 单调递增。

先模拟了一堆小样例,企图定下一个下界再进行构造,然后啥发现没有,这个换来换去似乎没有任何的规律。

然后专心考虑换到一边发生了什么变化。
容易发现换过来的一堆必须是连续的,因为题目不让我们从中间插进去,于是想着枚举一个中间的断点,然后两边贪心一波。可是总能发现一些 hack 情况,于是一直搞一直搞搞了个极其复杂的做法。
写完后又一直调一直调,因为过不了大样例就一直找 hack, 一直改,死活不愿意放弃。

最后得分 \(0\)

其实在想着枚举中间断点的时候就已经没有救了。
谁!告!诉!你!每!个!都!要!移!动!

事实上,考虑不移动的会简单很多。只要中间没有交叉,其它的全都排左排右就可以了。
中间不需要换的同样也是连续的。我在前面的贪心中考虑的诸多需要特判的移动“减免”情况在这里都不用考虑,因为肯定会被包括进去。

但还没有结束,因为 \(O(n^2)\) 是过不了的。
不过很容易想到连续的不重复的部分直接搞个简单 dp 就行了。

C

找到最多的 abccbc 子串。

我怎么会傻到认为直接大力 dp 就能过的?显然 aabbcc 就是反例, 因为这里是可以交叉的。

有一个重要的性质,c 全部扔到最后肯定是最优的。那么可以枚举最后的几个 c 然后验证。
这个有单调性,所以二分就行了。

D

T2 都想不出来想什么 D!

最后

在 T2 做了很久的情况下真的是很难说服自己把它放弃——虽然 SOP 如是要求。

请严格遵守 SOP,说不定下一题做一会儿再回来就能想到了。

posted @ 2021-07-21 16:07  Acfboy  阅读(34)  评论(0)    收藏  举报