ARC122

康复训练 Day 2

A

in a row means “连续地” but not “在一行”

经典因英语水平不够而错误理解题意

读明白题以后随便dp就行,记一下上一步填的是什么符号

Submission #23367542 - Tokio Marine & Nichido Fire Insurance Programming Contest 2021(AtCoder Regular Contest 122)

B

要求最小化\(\frac{\sum(x+a_i-\min(a_i,2x))}{n}\),把常量扔掉以后即最小化\(y=nx-\sum\min(a_i,2x)\)

后面那个min的取值与\(a_i\)\(2x\)的相对大小有关,所以想到给\(a_i\)排序

如果\(2x\)落在某段\([a_i,a_{i+1}]\)的区间上

\[\begin{align} y &= nx-\sum\min(a_i,2x)\\ &= nx-\sum_{j \le i}a_j-(n-i)\times2x\\ &= (-n+2i)x-\sum_{j \le i}a_j \end{align} \]

发现y在这段区间上单调或不变,x取某一端点不会更劣

于是枚举\(x=\frac{a_i}{2}\),推推式子\(O(1)\)计算即可

Submission #23368706 - Tokio Marine & Nichido Fire Insurance Programming Contest 2021(AtCoder Regular Contest 122)

C

经典赛时降智,赛后过题

\(x\)已经给定,考虑如果已知\(y\),那么我们只要不断拿大数减小数直至\(x=y\),再把这俩数step by step减成0即可

这样就逆向得到了操作方案,关键是如何确定b

遇事不决直接随机化,随一个b之后算算步数是否<130,计算时大数减小数的过程可以用大数除小数来优化,这样复杂度就和辗转相除一样了,\(O(\log n)\)

极限数据测一下发现跑的贼快,交上去也确实可以AC(随机化大法吼啊)

Submission #23368706 - Tokio Marine & Nichido Fire Insurance Programming Contest 2021(AtCoder Regular Contest 122)

感觉考场思路很接近正解了,这里也整理一下

容易知道辗转相加得到的是斐波那契数列\({f_i}\),也不难想到n可以拆分成\(O(\log n)\)\(f_i\)之和

难点在于如何将这些\(f_i\)加起来,这里有一个很巧妙的思路

考虑已经有了一个辗转相加的操作序列,我们计算一下在某个位置插入\(+1\)操作之后对最后的\(x\)产生的影响,显然也会是斐波那契数列的某一项

最重要的一点是,插入的若干个\(+1\)对最终值的影响是独立的

剩下的就是根据奇偶性决定\(+1\)是给\(x\)还是\(y\)即可

代码咕咕咕了

posted @ 2021-06-12 22:57  _SingerCoder  阅读(173)  评论(0编辑  收藏  举报