省选模拟41 题解

A. 要换换名字

显然二分一个答案,然后问题转化为二分图中是否存在一组完美匹配。

然后发现,如果一个字符串的子序列个数超过 $n$ ,那么就没有必要接着连边了。

所以对每个字符串建出不超过 $n$ 条边,然后跑个网络流就完事了。

B. 动态半平面交

因为太菜了,所以只会用一些套路来做这个题。

容易发现 $lcm$ 就是对每个质因子给指数取 $\max$。

所以考虑以深度为下标,维护一个单调栈。

然后对这个单调栈进行差分操作表示每次的变化量。

然后这个问题在树上的复杂度不正确,所以搞个 dsu 就完事了。

然后发现现在单调栈并不是在尾部插入了,所以需要搞个 set 来维护这个单调栈。

把线段树持久化一下,就可以在线回答询问了。

正解的思路是这样的。

考虑把 $p^k$ 这个玩意转化为 $k$ 个物品,其中每个物品的权值都是 $p$。

然后现在的问题就是给定 $u,d$ ,问 $u$ 子树中距离不超过 $d$ 的物品的权值乘积。

这个东西直接用 set 维护一下链并就行了。

常规的思路都是从子树到父亲的转移,然后就需要限制 $d$ 这个东西就很麻烦。

然后这里的做法是按照深度从小到大转移,然后使线段树的下标为 $dfs$ 序,这样的话直接查询最大的深度所在的线段树就完事了。

C. 获取名额

显然答案是 $1-\prod \limits_{i=l}^r 1-\frac{a_i}{x}$。

为了避免高精度,首先给每个 $a_i$ 和每个 $x$ 都除掉一个 $\max(a_i)$。 

考虑给后面的连乘套上一个取$ln$,然后就转化为了简单的求和的形式。

但是仍然是与 $x$ 有关的形式,没办法直接搞。

所以整个泰勒展开,维护 $x^k\ (k \leq 30)$的系数,然后计算就可以了。

然后发现这个取 $ln$ 操作在 $a_i$ 特别大的时候,就会导致 $ln(1-\frac{a_i}{x})$ 这个数的绝对值很大,然后精度就没了。

但是容易发现这样的数不会很多,因为精度只要求到 $10^{-6}$,如果这样的数很多就可以直接跳出了。

考虑定义一个阈值为 $0.5*x$ ,如果 $a_i>0.5*x$ ,就暴力计算这样的数,否则直接用泰勒展开。

因为是静态的,所以整个 ST 表出来,然后直接按照最值分治就好了,如果当前的数精度已经够了,就直接跳出分治。

然后发现因为每次找最值的精度都翻倍,复杂度显然是不超过两个 $log$ 的。

猜你喜欢

转载自www.cnblogs.com/skyh/p/12451798.html