第二十七次
A
答案等于 $\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n\left\lceil\dfrac{d(i,j)}2\right\rceil$,于是随便怎么求一下,比如换根 DP。
B
维护 $n$ 棵 01Trie,第 $i$ 棵维护集合中 $i$ 的倍数,插入 $x$ 时,$\forall d|x$ 把 $x$ 插入第 $d$ 棵 01Trie,
查询 $x,k,s$ 时,在第 $k$ 棵 01Trie 中查 $\le s-x$ 的,异或 $x$ 最大的数,
维护子树最小值,贪心进入某棵子树时判一下这个子树里有没有 $\le s-x$ 的点,没有就不能进。
C
来点神秘做法,复杂度是对的,而且会比 DP 优。
考虑逐个二分,发现复杂度 $O(nm\log V)$ 寄了。
考虑加点剪枝,发现若某段行程的答案 $\le$ 当前答案则不用对它二分,而这个判断可以 $O(n)$ 完成。
此时只会在每个前缀最大值处二分,发现答案递增还是会寄,
于是使用小杀招,shuffle 所有行程,此时前缀最大值只有 $\log m$ 个,总复杂度 $O(n\log m\log V+nm)$。
D
若 $u$ 路径的起点在 $v$ 路径上,则 $u$ 必须比 $v$ 先走,
若 $u$ 路径的终点在 $v$ 路径上,则 $v$ 必须比 $u$ 先走。
考虑建图,边 $u\to v$ 存在当且仅当 $u$ 必须比 $v$ 先走,
若建出的图有拓扑序,则按拓扑序操作即可,否则无解。
建图的复杂度太高,于是考虑线段树优化建图,分别考虑两个要求:
若 $u$ 路径的起点在 $v$ 路径上,则 $u$ 必须比 $v$ 先走
把每条路径向其起点连边,然后把每条路径除起点外的点向这条路径连边,
此时 $u$ 连向 $u$ 的起点,而 $u$ 路径的起点在 $v$ 路径上,所以 $u$ 的起点连向 $v$。
若 $u$ 路径的终点在 $v$ 路径上,则 $v$ 必须比 $u$ 先走
把每个终点向其路径连边,然后把每条路径向这条路径除终点外的点连边,
此时 $u$ 路径的终点在 $v$ 路径上,所以 $v$ 连向 $u$ 的终点,而 $u$ 的终点连向 $u$。