模拟89 题解
A. 666
应当注意到一个结论:
带着一个剪贴板进行删除操作是没有意义的。
可以转化为粘贴之后删除。
所以直接跑spfa求最短路。
注意到答案不超过48,所以边权超过48的边可以忽略。
B. 1234567
显然用莫比乌斯函数容斥。
发现答案为$\sum \limits_{i=1} \mu(i)\frac{n}{i^2}$
然后发现只会线性求。
打个表发现这个东西也可以除法分块,$\frac{n}{i^2}$在$n=10^18$的范围内只有一百多万个不同的取值。
所以杜教筛莫比乌斯函数前缀和,套个平方意义下的除法分块就行了。
做这道题确实对杜教筛有了更多的一些理解。
因为$\lfloor \frac{n}{i*k} \rfloor=\lfloor \frac{\lfloor \frac{n}{i} \rfloor}{k}\rfloor$这个式子,杜教筛就很强。
C. 椎
很有意思的一道题。
考虑最暴力的做法做这道题(在不会平衡树的前提下)。
按$key$值排序,每次取出$rand$值最大的一个点,并递归左右子树。
两个点$a$,$b$的$lca$显然对应着区间$[a,b]$内$rand$值最大的点。
而对于每个点,维护它左侧的单调栈和右侧的单调栈,该点的深度对应着两个单调栈中元素个数的和。
似乎正确性都是显然的,所以用线段树维护单调栈来支持这个操作。
以左侧的单调栈为例,大概思路是维护每个区间的最值,左子树中单调栈被右子树更新之后的单调栈大小。
在询问的过程中维护已经更新的最大的元素,优先递归右子树,
在递归出完整区间后可以继续递归进行二分,只要保证只递归一条链,复杂度严格$O(nlog^2)$