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