AtCoder Grand Contest 013


A - Sorted Arrays

直接贪心地从前往后取即可。

B - Hamiltonish Path

考虑随便取一条路径 \((u,w_1,w_2,w_3,...,w_k,v)\)

那么我们对于 \(v\) 的所有没取过的点,随便选一个取下去即可,这样一定会有终点。

然后对于 \(u\) 同理,我们但是是往前取即可。

C - Ants on a Circle

经典题的扩展。

经典题就是把原问题变成直线上的问题,做法就是直接把两个蚂蚁相遇看作“穿过”了对方,只是编号会交换。

但是我们还可以发现一个性质:所有点之间的相对位置是不会变的。

所以我们直接预处理所有结束位置,排个序即可。

接下来回到这道题,需要把问题放到圆上面。

我们发现现在的序列不是满足相对位置相同了,而是循环同构的。

发现并不好做,但是我们发现我们可以把两个人相遇看作是穿过了对方,但是其编号一个减一,一个加一。(从编号交换加强为了一个减一,一个加一)

那么相当于对于每一个人算出有多少人和他相遇过就能得出他最后的相对位置。

这个就很好做了,先把整圈的相遇算出来,再算出不满一圈的相遇即可,这个可以二分得到。

D - Piling Up

首先我们可以很快发现,任何时候总数都是 \(n\) (废话),所以任何时刻都有:红色有 \(x\) 个,蓝色就有 \(n-x\) 个。

然后很容易看出一个 dp ,也就是 \(dp[i][j]\) 表示已经取了 \(i\) 个数,当前有 \(j\) 个红色,可以得到的方案数。

但是我们发现这样会算重,对于一个不同的初始序列,如果每一步操作都相同,那么其取出来的序列也一定相同,我们就会算很多次。

但是我们发现,对于每一类这样操作相同的状态,如果按照 操作次数-当前红球个数 作出坐标系,那么一定在这类状态中存在某一个状态,是和 \(x\) 轴相交与一些点上的。(且仅有这一条)

所以我们只需要求出对于所有与 \(x\) 轴有交点的状态的和即可,具体见代码或者其他题解。