<span>省选模拟49 题解</span>
A. Manager
问题是每个子树的中位数。
每次的修改操作是改成最大值。
所以只要考虑修改前的值是 $x$,如果 $x$ 大于一个祖先的中位数,那么对中位数无影响,否则将答案更新为中位数右移一位的数即可。
然后发现只要预处理出两种答案。
每次的操作就是询问一条祖先链,这个只要用一个数据结构维护一下,支持单点修改区间查询就完事了。
B. GCD再放送
首先弄一个莫比乌斯反演,然后问题就转化为了对 $\gcd$ 为 $x$ 的倍数的计数。
对于每个 $x$,将每个序列分为三类。
分别是整体的 $\gcd$ 为 $x$ 的倍数、有一些前缀 $\gcd$ 为 $x$ 的倍数、有一些后缀 $\gcd$ 为 $x$ 的倍数。
然后可以将区间 $gcd$ 为 $x$ 的倍数分为几类。
对于每一类,分别用组合数计算就行了。
C. dict
要统计字典序严格小于另一个字符串的字符串个数,那就搞个按位确定。
枚举前面有多少位与原字符串相同,然后钦定当前位小于比较字符串的当前位即可。
然后发现每次能填的数并不多,暴力去用组合数做就是 $O(nm)$ 的,其实不断填数的过程就对应着二叉树的划分。
所以发现搞一个 $dsu on tree$,每次分两种情况:当前集合、全集减补集套路即可。