第五十六次
A
有解的话往直径端点走一定是一组解。
B
手玩一下,可以发现,令 $p\gets a_x$,对 $i\in(x,y)$ 依次执行:
- 若 $p\operatorname{and}a_i\ne 0$,令 $p\gets p\operatorname{or}a_i$。
之后,若 $p\operatorname{and}a_y\ne 0$,则可达。
进一步地,令 $p$ 分别取 $a_x$ 二进制下每一位,得到的结果之 $\operatorname{or}$ 与原结果相同。
也就是说,只需要知道 $p$ 分解出的若干 $2^k$ 通过 $(x,y)$ 得到的结果,简化了问题。
在线段树的每个节点上维护 $c_k$ 表示 $2^k$ 通过该节点的结果,这样将 $p$ 分解就可以知道 $p$ 通过该节点的结果。
令 $p$ 依次通过 $(x,y)$ 分解出的每个节点,就可以知道 $p$ 通过 $(x,y)$ 的结果了。
C
按最后一次被打的时间、最后一次被打后是否空血把陨石划分成若干颜色段 $(l,r,t,0/1)$,
其中每个陨石均在 $t$ 时最后一次被打,且最后一次被打后均是 / 否空血。
注意到 $\forall(l,r,t,1),l=r$,所以可以额外维护出 $c_l$ 表示这个陨石最后一次被打后剩多少血。
考虑一只恐龙会让这些颜色段发生什么变化。让它从左往右依次通过每个颜色段:
-
若当前颜色段形如 $(l,r,t,1)$,直接根据记录下的 $c_l$ 计算恐龙和这块陨石的血量变化即可。
-
若当前颜色段形如 $(l,r,t,0)$,考虑恐龙能不能走完这个颜色段。
如果能走完,那这些陨石最后一次被打的时间被更新为当前时间,且均被打成空血。
否则二分出恐龙能走到的位置 $k$,则 $[l,k-1]$ 的陨石同上,$k$ 陨石形成颜色段 $(k,k,t,1)$,$[k+1,r]$ 的陨石不受影响。
现在问题变为给定 $l,r,t,T,h$,判断 $[l,r]$ 的陨石在 $t$ 时最后一次被打成空血后,$T$ 时到 $l$ 剩 $h$ 血的恐龙能否通过 $[l,r]$ 这些陨石,
也就是判断 $\sum\limits_{i=l}^r\min\{r_i(T-t),c_i\}$ 是否小于 $h$。
定义 $f_i(x)=\min\{r_ix,c_i\}=\begin{cases}r_ix&x\le\left\lfloor\dfrac{c_i}{r_i}\right\rfloor\\c_i&x>\left\lfloor\dfrac{c_i}{r_i}\right\rfloor\end{cases}$,问题变为求 $\sum\limits_{i=l}^rf_i(T-t)$。
令 $\Delta=T-t$,设 $f_i(\Delta)=a_i\Delta+b_i$(具体地,$a_i=\begin{cases}r_i&x\le\left\lfloor\dfrac{c_i}{r_i}\right\rfloor\\0&x>\left\lfloor\dfrac{c_i}{r_i}\right\rfloor\end{cases}$,$b_i=\begin{cases}0&x\le\left\lfloor\dfrac{c_i}{r_i}\right\rfloor\\c_i&x>\left\lfloor\dfrac{c_i}{r_i}\right\rfloor\end{cases}$),
则 $\sum\limits_{i=l}^rf_i(\Delta)=\sum\limits_{i=l}^ra_i\Delta+b_i=\Delta\sum\limits_{i=l}^ra_i+\sum\limits_{i=l}^rb_i$,只需求出代入 $\Delta$ 时的 $\sum\limits_{i=l}^ra_i$ 与 $\sum\limits_{i=l}^rb_i$。
令 $v_{i,j,0/1}$ 表示代入 $i$ 时的 $a_j,b_j$,可以发现序列 $v_i$ 只是在序列 $v_{i-1}$ 的基础上修改了所有 $i=\left\lfloor\dfrac{c_j}{r_j}\right\rfloor+1$ 的 $j$ 位置,于是可以主席树维护 $v$。
这样 $\sum\limits_{i=l}^ra_i=\sum\limits_{i=l}^rv_{\Delta,i,0},\sum\limits_{i=l}^rb_i=\sum\limits_{i=l}^rv_{\Delta,i,1}$,在 $v$ 上查区间和即可。
D
啥玩意,看不懂啊。