闲扯
考试想到了分段写,但是懒。。。
$T1$
Solution
显然,我们可以观察出这样一个性质:每次充电一定充满。
由这一点,我们可以得出每条路的停止次数为 $\lceil\frac{dis}{w}\rceil$ 。
我们观察到,对于电量为 $w$ 的车,我们走 $dis\in[k\cdot w+1,(k+1)\cdot w]$ 的路,答案都是 $k+1$ 。
所以我们可以枚举这一个 $k$ ,然后计算在 $[k\cdot w+1,(k+1)\cdot w]$ 这个范围内的路径的个数,就可以得到最终的答案。
对于每一个 $w$ ,我们的时间复杂度是 $O(\log^2n\cdot \lceil\frac{L}{w}\rceil)$ ,其中 $L$ 表示路径长度的最大值。
对于 $w$ 较大时,我们这个方法的复杂度是比较优秀的,但是 $w$ 较小的时候,就变得十分的弱智,甚至不如直接暴力。
所以我们对 $w$ 较小的用线段树维护一下,较大的再用这种方法查询即可。
其中这个界限大概设到 $\sqrt{n}$ 即可。
Code
1 |
|
其实可以不用树剖,改成查询两个点到根结点,再减去 $lca$ 到根结点的,这样就只有一个 $\log$ ,但是没必要。
$T3$
Solution
这道题需要知道一个结论:在一个有序的数列中任选两个数异或起来,最小值一定在相邻两个数的异或中取到。
然后我们就可以像把数组排个序,然后设 $dp_i$ 表示以第 $i$ 个元素作为数列的结尾,合法的子序列的个数。
那么我们有 $dp_{i}=1+\sum_{j=1}^{i-1}dp_j$ ,其中 $j$ 满足 $val_i\ xor\ val_j\geq x$ 。
这样我们就得到了一个 $O(n^2)$ 的转移方程。
考虑优化。
我们只需要将 $dp$ 放在 $Trie$ 树上,然后维护一下子树和即可。
Code
1 |
|