ZR提高失恋测3
(感觉这一场比以往的简单了一些)
估分 100 + 40 + 40
得分 100 + 60 + 40
???
A
首先,我们能够想到一个比较简单的\(n^2\)做法,
枚举答案子序列中两个\(1\)之间\(0\)的个数(就是题目中的距离),直接贪心能选就算,肯定不会似的答案更劣
这样就有了\(60\)分的好成绩
我们考虑如何优化这个暴力,
由于0的个数不具有可二分性,所以不能对外层枚举进行优化,那么我们只能对这内层循环下手了
发现我们每次暴力找\(x\)的\(0\)这个过程太慢了,我们想到两个方式去优化
首先 二分
我们维护一下前缀\(1\)的个数
每次二分查找一下下一次跳\(x\)次\(0\)的位置
其次
倍增,感觉道题同二分把,把\(x\)二进制拆分然后求\(k\)级祖先
注意写代码的时候有一个需要一个细节,就是如果最后一个匹配成功的是\(1\)
或者最后一段的\(0\)没有匹配满的时候,最后一个的\(100\dots\)的贡献是要减去的
B
首先这个\([dis,1.1\times dis]\)就肯定要搞点东西
首先,还是非常朴素的暴力,我们对于每个点,都去维护一下到这个点的所有的路径的长度
然后暴力合并
之后读进来一个询问点就暴力lower_bound一下判断合法不合法,这样就有60分了
我们上面的暴力并没有用到\(1.1\times dis\)这个东西,我们仔细想一下有什么用?
如果一个点有三条路径\(x,y,z\)满足
\(\frac{z}{1.1} <x < y < z\)
那么\(y\)这一条路径是没有用的
因为
也就是\(y\)的功能能够完美的被\(x,z\)去代替
这也就提示我们需要存的路径不会太多,那么有多少呢
我们发现上面的情况
\(1.1 ,1.1^2 ,1.1^3,\dots 1.1^x\)
极限情况也要是这样的数列才不会出现上面的情况
而\(1.1^{450} > 10^{18}\)
所以一个点的合法路径条数不会超过\(450\)
我们可以考虑去只维护合法的部分
我们维护一个递增的数组表示路径
每次对于一条边\(x->y\)
我们直接把两个数组类似归并排序的方式合并就好了
只要在合并过程中出现
上面\(x,y,z\)的情况,就把\(y\)踢掉
最后依旧二分查一下答案就好
C
大分类讨论
先咕咕咕