A
先找找有什么通解。发现找不太到。
考虑直接构造,每个点 i 向 i−lowbit(i) 连边。
容易发现会有大约 logn 个点的 i−lowbit(i)<l。也就是有若干个连通块。
考虑暴力对这些点跑 kruscal,复杂度 O(qlog2nloglog2n)。
打表发现跑出来的生成树一定满足 l 向其他点连边,复杂度将为 qlogn。
B
直接朴素 dp,O(n2)。
数据结构优化,线段树上 trj 表示下一个区间选了 [j,i] 的贡献。
若 [j,i] 非法,trj=0。反之 trj=fj。
维护两颗线段树,表示重要位置在奇/偶数下标。
-
如果 i 不是重要节点,那么 j∈[1,lsti] 不能选。
-
如果 i 是重要节点,那么 j∈[1,prei,1−o]∪[prei,o+1,i] 不能选。
注意撤销 [preprei,o,o+1,prei,o] 的标记。
扫一遍 i 的同时将 fi 加进线段树即可。