[学习笔记]day3-CF464-Div2
本来是在双指针的那篇blog里看见这场的E题然后写了,后面连着把A~D也写了。准备写博客的时候发现E好像和双指针关系不是那么大,就另外开一篇来记录一下部分题解。
A-Love Triangle
题意:给\(n\)个人和他们喜欢的人的编号\(f_i\),问是否存在三角恋。
本场签到,判断是否存在\(f[f[f[i]]]=i\)即可。
$ $
B-Hamster Farm
(学到新单词hamster仓鼠√)
题意:有\(n\)只仓鼠,以及\(k\)种类型的用来装仓鼠的盒子,第\(i\)种盒子能装\(a_i\)只仓鼠,需要选择购买一种类型的盒子(个数不限)来装仓鼠,每个盒子必须装满,希望能装尽可能多的仓鼠,问购买哪个盒子以及要买几个。
也很签到,选择t=n/a[i]*a[i]
最大的那个盒子即可
$ $
C-Convenient For Everybody
题意:有\(n\)个时区,时间从1开始编号,如果第一个时区的时间是1,那么第\(i\)个时区的时间就是\(i\)。现在有个平台想要选个时间举办比赛,每个时区可能参加比赛的人有\(a_i\)个,该时区的人参加比赛当且仅当比赛开始时间在\((s,f]\)内,现在希望选一个时间让参加比赛的人最多。输出1号时区对应的时间。
好像也很签到(x)。\(s,f\)对所有时区都是一样的,破环成链把\(a[]\)翻倍,对应的参加比赛的就是一个长度为\(f-s\)的区间,找到和最大的区间。需要注意的大概是时间的转换。
$ $
D-Love Rescue
题意:两个长度相同的字符串\(s,t\),你希望把他们变得一样。你可以购买一个咒语\((c_1,c_2)\)使得\(c_1\)和\(c_2\)两个字母可以互换,购买一个咒语之后就可以使用任意多次。问最少需要购买多少咒语,以及输出任意一组方案。
可以互换这个东西就很图论(因为容易想到\(a\to b\to c\)这种东西,如果已经有\((a,b),(b,c)\)那么就没有必要再来个\((a,c)\)了)。于是把所有需要转换的字母之间连一条边,对于\(n\)个点的连通块只要\(n-1\)条边,而对应的方案则是dfs跑出来的树的所有边。
$ $
E-Maximize!
题意:你需要维护一个多重集\(S\),有两个操作:1.加入一个新的元素\(x\),其中\(x\)不小于\(S\)中的所有元素。2.找到一个\(S\)的子集\(s\)使得\(max(s)-mean(s)\)最大,mean(s)指s的均值。\(Q\leq 5\times 10^5\)。
具体证明过程可以看官方的题解:https://codeforces.com/blog/entry/57892
这里我只记录一下自己思考这题的过程。
因为是往一个集合里加东西,以及询问一个东西,像增量法那样,我们想想能不能从\(S=\{a_1,\dots,a_n\}\)对应的答案集合\(s\)推出\(S\cup B\)的答案。
更具体地,考虑\(B\)是不是一定在新的答案集合里:设\(s=\{b_1,b_2,\dots,b_k\}(k\geq 2)\),现在新加入的\(B\)一定有\(B\geq b_k\),相等的情况没什么好讨论的,直接当\(B>b_k\),那么记把\(b_k\)换成\(B\)的集合\(s'\)对应的要最大化的式子是\(M'\),\(s\)对应的是\(M\),则\(M'-M=B-b_k-\frac{1}{k}(B-b_k)=(B-b_k)\frac{k-1}{k}>0\),于是说明了,至少最大元素一定在答案集合内。
(中间我还尝试考虑了换其他元素以及添加的情况,不过从最后的结果看来没什么必要,这里就不写啦)
接着我们继续想,既然最大值确定了,那\(max-mean\)的\(max\)其实是定好的,那我们只要让\(mean\)尽量小就行了,这个是很好确定的:从小到大往集合里加元素,只要当前的\(a_i\)比当前的平均值要小,就加进去让它拉低平均值。
这样暴力做复杂度是\(O(Q^2)\)的,不过注意到:每次更新最大值的一步只会把均值拉大,这样子原答案集合\(s\)里所有小的元素一定是可以继续留在新的\(s'\)里的,只有可能出现另外添加一些新元素来拉低平均值。于是就可以\(O(Q)\)地解决这题啦,代码还很短(三十行不到)。