模拟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)$

posted @ 2019-10-27 21:14  skyh  阅读(149)  评论(0编辑  收藏  举报