思路
答案就是长度为$l$的区间最小的区间和,设其为$k$。
若答案$ans$大于$k$,因为最多只有$k$只青蛙能越过区间和为$k$的区间,一定不成立。
设$pi$为第$i$个石头的位置,因为最小的区间和为$k$,所以$p{i+k}-p_i\le l$,一定有方法过河。
以下各式中除法默认为向下取整的整数除法($\lceil\quad \rceil$标注的除外)
$${a\over b}\ge c \implies \begin{cases}a\ge b\times c\\ b\le {a\over c}\end{cases} \\
{a\over b}\le c \implies \begin{cases}a\le b\times c+b-1\\ b\ge {a\over {c+1}}+1\end{cases}$$
对于$$\lceil {a\over b}\rceil$$可以转化成$${a+b-1}\over b$$利用向下取整的方法运算
对这种带取整的式子,要考虑是不是很多情况取整后都是一样的值,此题
$$\lceil log_pa \rceil=i\qquad p^{i-1}<a\le p^i$$
由于$a\le 1e9$ $i$最大的取值为$30$,排序预处理出前缀和,对每个p二分即可
1 | #include "bits/stdc++.h" |
对每个节点开一个树状数组维护前缀最大值(即区间$[1,n]$的最大值)BIT[i][j]
表示存在一条指向$i$点的路径,路径中最后一个边的权值为$j$
那么对每条边$u,v,w$,查询指向$i$的路径中,最大权值不超过$w-1$,长度最大的路径的长度(即BIT[u][w-1]
),再加一即为以$v$结尾,最大权值为$w$的路径的长度,同时把这个值更新到BIT[v][w]
中,因为是按读入边的顺序处理的,所以可以满足边的编号递增的条件,查询的最大值即为答案。
注意直接开所有的树状数组内存是不够的,使用map
就可以了
1 | //4 24 |
奇数个点组成的路径才对答案有贡献
具体的解法是对每个点计算它对答案的贡献
每个点(设为$u$)对答案的贡献有两部分
1 | //4 18 |