<span>模拟94 题解</span>
A. 凉宫春日的忧郁
数据范围就长得很可写高精度的样子。
可以维护高精度的高位,舍弃低位信息。
正解是取对数。
$x^y=y*log\ x$
$y!=\sum \limits_{i=1}^{y}log\ i$
然后可以直接比较两个取对之后的$double$类型。
B. 漫无止境的八月
显然将问题转化为差分。
单点修改转化为单点加一个值,下一位减去一个值。
区间加法转化为当前位加上一个值和$k$位后减去一个值。
然后发现可以把全部的信息都转移到最后$k$位,然后用一个变量维护$k$个数中有多少个不为$0$就完了。
然而本题其实是语文题,谁能想到出题人修改的是终止区间呢。(并不看样例解释)
C. 射手座之日
显然区间$[i,j]$的$lca$为区间中的$dfs$序最小值和最大值的$lca$。
所以想到分治维护最值,然后这个$lca$就并不像方案数/乘法/加法等信息可以用结合律简单维护。
部分分提示我们:通过枚举$lca$,找出有多少个区间,满足最值在$lca$的$dfs$序范围内。
然而这个似乎挺难做的,然后就完戏了。
正解要继续这个思路:
因为直接维护区间很困难,不妨考虑插入子树内每一个值的过程。
将子树内的每一个值插入序列中,检查多少个序列可以形成了连续的区间。
这个过程可以用链表(通过记录左右端点模拟)简单维护。
为了保证复杂度,选择树上启发式合并。
另一个思路是用线段树合并来维护这个过程,实际上区别并不大。
更加大神的思路是分治:
考虑分治区间$(l,mid,r)$,那么只要考虑跨过$mid$的方案。
处理出由$mid$分别拓展到左右端点的$lca$数组,设左侧的$lca$数组为白点,右侧的$lca$数组为黑点。
那么问题转化为每个黑白点对的$lca$的权值和。
暴力做树形$dp$一定是不行的,但是显然只关注$lca$处的信息,所以用虚树维护。