\(\mathcal{Preface}\)
分数 \(90+100+100+30=320\)。
挂完了,呜。
\(\mathcal{Problem \space{} A}\)
Tag:诈骗,循环。
减法可以出负数,我们希望最后的值最大,可以一开始用最小的值去减其他所有值,但是保留任意一个非最小值,最后用这任意一个非最小值去减最小值就可以了,一定是最大解。具体的,和是 \(a_2 + a_3 + \dots + a_{n-1} + a_n - a_1\),其中 \(a_1\) 是最小的数。
取余考虑保留,由于数组中的数各不相同,所以必定存在一个唯一的最小值,拿这个最小值不断去和其他值取余,最后也能保留下这个最小值,这一定是最大解。
因此两个都只需要算 \(sum\) 总和以及 \(mn\) 最小值就可以解决了。
注意特判 \(n=1\) 的情况啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!赛时没注意挂了 \(10\)pts。之后一定要注意看边界的一些特殊情况!!!!!!1111
\(\mathcal{Problem \space{} B}\)
Tag:分讨,贪心。
由于题目保证肯定可以在两次以内搞定,因此不满足回文串的位置最多也只有两处,记为 \((d_1,n-d_1+1)\) 和 \((d_2,n-d_2+1)\) 两对。如果只有一处,那么 \(d_2 = 0\),\(d_1\) 存数;而一处都没有的情况,即一开始就是回文串的话,\(d_1\) 和 \(d_2\) 当然就都不会存数了。
首先考虑一开始就是回文串的情况。显然我们手里还有两次操作,可以考虑将一些位置改成 a
,优化字典序。从前往后找到这个位置对即可,至于为什么要去找,因为存在一开始就是 a
的,没必要再浪费次数修改重复的。
接着考虑只有一个位置需要修改的情况。如果 \(d_1\) 和 \(n-d_1+1\) 这两个位置中存在一个为 a
的,那么这里就只消耗了一个次数,还剩下一个次数怎么使用呢?只有当 \(n\) 是奇数的时候,我们可以考虑把最中间的那个,自己对自己的回文字符,改成 a
;否则,这个次数就只能闲着啦。不过如果 \(d_1\) 和 \(n-d_1+1\) 两个位置中不存在任何一个为 a
的,那么两次就消耗完了,直接都改成 a
即可。
最后考虑有两个位置需要修改的情况,这种很简单,两个对子中都要分别选择一个字典序大的一端,把它的值改成那个较小字典序的字母,最后输出就 OK 啦。
\(\mathcal{Problem \space{} C}\)
Tag:判断质数,质数筛。
并不需要 DFS,虽然结构是棵树。
只要对读入的每条边,判断一下,如果这条边连接的两个点的点权加起来的值是质数,就让 \(ans \to ans+1\)。考虑顺序?不不不,只要定某个点为根,然后从叶子往上改就好了。
为了更快判断质数,一开始写个埃氏筛就行了。没必要写线性筛,多此一举。