A.DeadLine (暴力/简单数学,三分查找)

方法一:

方法二:

方法二:三分查找

emm,比赛的时候弄错了,写了个假算法,用的二分去写的。但是鬼使神差的过了,而且还过了hack,想不通。也真是运气好了.不然这一场就炸了.

B. Yet Another Meme Problem  (打表)

思路:打表找规律发现只有当b = 9,99,999 这种全9数时上式才成立。

合理性:

C.Two Arrays (dp/组合数学)

题意: 给你n,m,利用1~n之间的数(可重复)来组成长度为m的数组a,b,要求数组a非递减,数组b非递增,且对应位上的a数组的数 <= b数组中的数,求出a,b数组对数.

方法1:dp变形

优化:

方法二:组合数学

5

D.MiniMax Problem(二分答案,枚举子集)

题解:

观察到m很小,那么我们可以将每一行转化成一个二进制数mask[i],若当前的值大于等于目标值,那么就设为1,否则设为0.这样以来,对于一个目标值x来说,我们只要找到任意两行的mask符合mask[i]|mask[j] == (1<<m)-1即可.

直接枚举复杂度太高,将其压缩成一个二级制数映射到数组book里去,两层循环i,j枚举子集,  i | j == (1<<m)-1且book[i] == 1 且 book[j] == 1 时,存在两行满足条件.记录下这时的i,j,记为res1,res2

最后O(n)循环遍历mask数组,找res1 res2.

AC代码:https://codeforces.com/contest/1288/submission/68964584

E. Messenger Simulator (树状数组,动态维护)

题意:

一开始有一个初始顺序的排列[1,n],一共有m次操作,每次将数ai从序列中取出,放到最开头的位置生成一个新的排列。

求问在所有过程中每一个数最小的下标位置和最大的下标位置。

具体题解见:

https://www.jianshu.com/p/7eded28309e5