ZR提高失恋测3

ZR提高失恋测3

题目链接

(感觉这一场比以往的简单了一些)

估分 100 + 40 + 40

得分 100 + 60 + 40

???

A

首先,我们能够想到一个比较简单的(n^2)做法,

枚举答案子序列中两个(1)之间(0)的个数(就是题目中的距离),直接贪心能选就算,肯定不会似的答案更劣

这样就有了(60)分的好成绩

我们考虑如何优化这个暴力,

由于0的个数不具有可二分性,所以不能对外层枚举进行优化,那么我们只能对这内层循环下手了

发现我们每次暴力找(x)(0)这个过程太慢了,我们想到两个方式去优化

首先 二分

我们维护一下前缀(1)的个数

每次二分查找一下下一次跳(x)(0)的位置

其次

倍增,感觉道题同二分把,把(x)二进制拆分然后求(k)级祖先

注意写代码的时候有一个需要一个细节,就是如果最后一个匹配成功的是(1)

或者最后一段的(0)没有匹配满的时候,最后一个的(100dots)的贡献是要减去的

代码

B

首先这个([dis,1.1 imes dis])就肯定要搞点东西

首先,还是非常朴素的暴力,我们对于每个点,都去维护一下到这个点的所有的路径的长度

然后暴力合并

之后读进来一个询问点就暴力lower_bound一下判断合法不合法,这样就有60分了

我们上面的暴力并没有用到(1.1 imes 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

大分类讨论

先咕咕咕

代码

原文地址:https://www.cnblogs.com/wyxdrqc/p/11530434.html