省选模拟49 题解

A. Manager

问题是每个子树的中位数。

每次的修改操作是改成最大值。

所以只要考虑修改前的值是 $x$,如果 $x$ 大于一个祖先的中位数,那么对中位数无影响,否则将答案更新为中位数右移一位的数即可。

然后发现只要预处理出两种答案。

每次的操作就是询问一条祖先链,这个只要用一个数据结构维护一下,支持单点修改区间查询就完事了。

 

B. GCD再放送

首先弄一个莫比乌斯反演,然后问题就转化为了对 $\gcd$ 为 $x$ 的倍数的计数。

对于每个 $x$,将每个序列分为三类。

分别是整体的 $\gcd$ 为 $x$ 的倍数、有一些前缀 $\gcd$ 为 $x$ 的倍数、有一些后缀 $\gcd$ 为 $x$ 的倍数。

然后可以将区间 $gcd$ 为 $x$ 的倍数分为几类。

对于每一类,分别用组合数计算就行了。

 

C. dict

要统计字典序严格小于另一个字符串的字符串个数,那就搞个按位确定。

枚举前面有多少位与原字符串相同,然后钦定当前位小于比较字符串的当前位即可。

然后发现每次能填的数并不多,暴力去用组合数做就是 $O(nm)$ 的,其实不断填数的过程就对应着二叉树的划分。

所以发现搞一个 $dsu on tree$,每次分两种情况:当前集合、全集减补集套路即可。

posted @ 2020-03-18 21:47  skyh  阅读(128)  评论(0编辑  收藏  举报