Codeforces Round #220 (Div. 2)

Codeforces Round #220 (Div. 2)

还是那句话,真正的高手,在数据有问题的情况下也能保证出成绩。。但很显然,我不是那种人。只能在赛后补题的弱渣,无话可说了。

A题:比赛的时候,可能大家想的太简单了,也都过了pretest。前面的做法就是看在x轴y轴的差距都能保证整除a,b的情况下,走的步数差为偶数。这个可以理解为用某一个方向上的一个调剂空间来走这个方向上的2步。那么这里就要考虑的是能否有调剂的空间了,几乎都是挂在了这里吧。。

代码:https://code.csdn.net/snippets/119003

B题:比赛的时候,数据错了。但是未能及时发现,最后还是挂了。思路是这样的,先考虑怎样会使得凑出来的9尽可能的多。先这样想,如果两个相邻的无法组成9,那么就从这里分开考虑,所以,最后我们就把这一串数分成一段一段的了,每一段里,任意两个相邻的数之和都为9,。然后把每一段能凑出9的个数尽可能多的情况数都乘起来就是答案了。那么对于某一段,怎样拼凑是最优的呢?对于一段有偶数个数,那么就只有一种拼法了吧,就是依次的两个两个组合起来了,奇数个的话,最多是可以组合出x/2个9的,那么就有一个数是要多出来了,所以这个多出来的数有几种位置,就是有几种拼法了,也就是x/2+1个位置嘛。然后就好了

代码:https://code.csdn.net/snippets/119009

C题:简单的深搜记忆化。从‘D’开始往下搜,搜到环的话,就是INF了,否则就用dp记忆化一下。

代码:https://code.csdn.net/snippets/119011

D题:这题的话。对于在末尾加进来数,那就加进来好了。关键是删除咋办呢?用一个树状数组维护下其实就行了。其实我们就是要知道某一个位置上的数有没有被删掉而已。这里也可以用线段树或树状数组+二分做。但是能巧妙的利用树状数组的性质更好。具体就是先认为每一个位置上的数都在,也就是都跟更新为1,然后删掉就是更新成0。那么怎么找到相应的位置删掉呢?(前面要删到哪个数为止用二分就不说了)。。这里就是类似与树状数组就第k小数一样的方法,看get()函数吧。

代码:https://code.csdn.net/snippets/119013

你可能感兴趣的:(codeforces)