模拟94 题解

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$处的信息,所以用虚树维护。

原文地址:https://www.cnblogs.com/skyh/p/11768126.html