ACM贴吧里有红/黄名会更cf、tc的题解,有需要的可以去看看
相关代码可以直接cf上找aynuzzh
虽然只是一个蓝名都不到的弱鸡选手233333
A
有这么一个手机按键,你去拨一串数字(不重复),看有没有可能拨错。比如12的话可能拨成45、78、23.。。。例如37就不会拨错。
个人做法是存储各个数字位置,比如1是1,1。9是3,3。然后记录每个按键与前一个按键所移动位置。第一个就不用比较了。然后第一个按键0-9看有没有可以的(除掉第一个按键相同情况)。
B
大意可以看做一个坐标轴由1到N,问1到1,2,3…..N每个点需要移动最小步数,有两种移动方式,一种就是移动一步,左或右移动一个位置。第二种就是每个点给定a[i](a[i]>=i)可以移动一步到a[i]。
个人做法用b[i]记录各个点到1的最小步数(初始为i-1)。是从1到N扫一遍,如果这个点移动到a[i]点的最小步数小于b[a[i]]。 则改变b[a[i]]的步数,并从b[a[i]]向左扫,看是否从b[a[i]]向左步数更少。
C
有四个小偷偷东西,每个小偷可以装N重量东西。并且每个小偷偷的东西是前一个人K倍。问小偷偷东西方案为M时,N最少重量是多少,如果不符合,输出1.
我们可以假设四个小偷偷的东西分别为(a,ak,ak^2,ak^3)。只需要算偷东西最多ak^3最小即可。于是可以二分答案N,区间1-10^16即可,看ak^3<=N偷的方案数。
D
给你两组长度为N的序列a[i]、b[i]。 问有多少个区间[l,r]使得a在区间最大值等于b在区间最小值。
建立线段树分别维护a区间最大和b区间最小。从1到n扫一遍为l的值,由于a递增,b递减。所以可以二分r的值,求出r1,r2为r的范围。我写法比较蠢,二分两次,第一次求r1,第二次求r2……
E
如果有什么想法…..之后再补。