2024.10.6训练记录
下午 cf
A
结论:排序后从前往后做就是对的。
感性证明:考虑把做完平均的式子通分,发现在a、b做完后分别和c、d做平均比ab、cd各自做平均更优。
于是要让更大的值被除的次数更少。
B
签到题,考场还是写挂了,今天码力差。
挂在 while()
动指针的时候没有判右边界,似。唐诗程度不亚于数组开小。
C1
猜出来结论是第一次出现需要按照一开始的顺序就能过。
C2 已订正
把一开始的排列映射到 \([1, n]\)。
修改时用 set
动态维护每个数第一次出现的位置。
把第一次出现位置的序列也开一个 set
维护,那么最终要满足的条件就是在这个总的 set
中是单调递增的。
如何维护单调递增:因为是单点修改,可以维护 set
中满足 \(s[i] < s[next(i)]\) 的数对个数,个数为 \(n-1\) 时就是递增。
这个trick应该会挺泛用的。
几个实现上的注意点:
调用前驱/后继的时候让迭代器自增/自减会很麻烦,写起来不知道到底动到哪了。
可以调用函数 prev()
、next()
。这样迭代器自己不会动。
因为执行序列中不一定每个数都会出现,一开始可以往后面插一个 \([1, n]\) 防止 set
越界。
我实际写出来很难看就是了。怎么大家都写那么好看/kel。
E1
猜两次结论题。
结论1:服务器只会搭在需要网的点上。
结论2:搭第 \(i\) 次服务器只需要在搭完 \(i-1\) 个的基础上做。
于是枚举每次搭在哪个点上,选对答案减小贡献最大的。
\(O(n^3)\) 解决。