玄题杂讲

· · 个人记录

题目:

oiClass #307. cats 的最小生成树

cats 有一个有 n 个点,m 个边的可能有重边的无向图。边有边权,其中第 i 条边的边权为 i

在一次操作中,cats 会找出这个图的最小生成树,然后将图中所有属于最小生成树的边移除。cats 会不断重复以上操作直到图不连通为止。

现在,你需要告诉 cats 图中的每一条边是在第几次操作中被移除的。若一条边在操作结束时未被移除,你需要输出 -1。可以证明在以上条件下,cats 每次选择的最小生成树一定是唯一的。

注:一个有 n 个点的图的最小生成树即为这个图的所有的包含全部 n 个点和刚好 n-1 条边的连通子图中使子图所有边的边权总和最小的子图。

oiClass #P2692. 采油

一家石油公司最近在一片区域开采石油,这片区域可以看作一个二维平面,其中 x 轴平行于地面,x 坐标表示地表的水平位置,而 y 轴垂直于地面,y 坐标表示深度。

这片区域内还有 n 个石油矿,每个石油矿都可以看作一条平行于 x 轴的线段,其中石油的储量即为该线段的长度,如下图就对应着样例一的输入:

现在这家石油公司想要挖一个石油井,石油井可以看作一条与 x 轴相交的直线(如上图中蓝色虚线所示),通过挖石油井,这家石油公司能获取到所有与石油井有公共点的石油矿内的石油(端点处或者在线段内均算)。

你的任务就是替这家公司找到一个挖石油井的方案,使得其能获得最大储量的石油,为了方便,你只需要输出最大储量即可。

oiClass #1184. 城堡保卫战

小S 的城堡正在被大量的怪物袭击,小S必须组织有效的保卫战。

共有 n 个怪物正在袭击城堡,第 i 个怪物的攻击力为 a_i,防御力为 b_i。城内有 m 个怪物猎人,第 j 个怪物猎人的生命值为 h_j

猎人可以和怪物对战,当猎人和第 i 个怪物对战时,猎人需要消耗连续的 b_i 秒时间攻击怪物,这段时间怪物也会攻击猎人,使猎人每秒初减少 a_i 的生命值。

一旦猎人的生命值小于或等于 0,猎人就会死亡,无法继续对战。若猎人未死亡,则 b_i 秒之后该怪物即被猎人消灭。

这些怪物有一个超能力:每当一个怪物被消灭后,其余的所有怪物的攻击力和防御力都会增加 d

由于请猎人作战的费用十分昂贵,小S 打算请一个猎人消灭尽可能多的怪物。当然,小S 可以自由决定猎人以何顺序消灭哪些怪物。

小S 想知道,对于每一个 j=1,2,\dots,m,如果请第 j 个猎人,最多能消灭多少个怪物。

oiClass #P3676. 小明的树

小明有一棵以 1 为根的 n 个节点的树,树上每一个非根节点上有一盏灯,他有一个 2 \thicksim n 的排列 a_1,a_2,\dots,a_{n-1}。他还有一个计数器,初始为 0

他会按照排列依次点亮这 n-1 盏灯,每进行一次点灯操作后,他会检查整个树是否是美丽的,如果是美丽的,计数器会加上此时点灯的节点形成的连通块的个数。

一个树是美丽的当前仅当对于每一个被点亮的节点,这个节点子树内的节点都是点亮的。 小明认为这个问题太简单了,他觉得应该让树动起来。 在初始查询后,他会删掉树中一条边并加上一条边,保证修改后还是一棵树,他想知道每一次修改后将计数器清零后重新点灯并计数,这棵树的答案是多少。 - $2 \leq n \leq 5\times 10^5$。 - $0 \leq m \leq 5\times 10^5$。 ### [P8576 「DTOI-2」星之界](https://www.luogu.com.cn/problem/P8576) 夜空中的星星组成了一个序列 $a$,序列中的第 $i$ 个数表示第 $i$ 颗星星的亮度。 现在,作为星之眷顾者的你,拥有两种方式来操作星星。 - 操作一:输入格式为 $\texttt{1 l r x y}$,表示将 $[l,r]$ 内所有亮为 $x$ 的星星的亮度改为 $y$。 - 操作二:输入格式为 $\texttt{2 l r}$,表示输出 $ \prod\limits_{i = l}^{r} C_{\sum_{j = l}^{i}a_j}^{a_i}\ \bmod 998244353 $ 的值。 - $1 \le n,q,a_i \le 10^5$。 - $1 \le l,r\le n;1 \le x,y\le 10^5$。 - 任意时刻 $\sum a$ 不会超过 $10^7$。 ### [oiClass #309. 脆弱易碎](https://oiclass.com/d/pu2ti/p/309) 梨梨和羽羽在野外发现了一棵无根树。如果选择一个结点作为根节点,然后拎起这个点,那么其他点会自然下垂。但是这棵树脆弱易碎,因此每一次这样操作之后,那些只跟树有一条连边的结点就会掉落(被拎着的点除外)。如果拎起一个单独的点,那么放下去之后它会碎掉。 于是她们想玩一个游戏,梨梨先手,轮流操作,每人每次选择一个结点,然后拎起这个点,然后放下。没有结点可操作者就输了。她们都是绝顶聪明的少女,那么谁会赢呢? 好不容易发现一棵无根树,玩一局就走实在是太浪费了。因此每次玩完以后,羽羽会用魔法还原整棵树。 用同一棵树一直玩会玩腻的,因此她们每一局都是先选两个点 $x$ 和 $y$,然后以 $x$ 作为整棵树的根,剪下以 $y$ 为根的子树,用这棵子树玩游戏。(子树剪下来之后还是当作无根树) - $1\leq n,Q \leq 2\times 10^5$。 # 题解: ### [oiClass #307. cats 的最小生成树](https://oiclass.com/d/pu2ti/p/307) 对 $n$ 个点开 $\left\lfloor \frac{m}{n-1} \right\rfloor$ 层并査集,从下到上第 $i$ 层并査集表示第 $i$ 次删除最小生成树前图的连通状态。 从小到大枚举所有边维护并査集,每次连接 $(u,v)$ 时,二分找到最低层和 $v$ 不连通的并査集(如果存在),将其合并即可。边被删除的操作次数即为这个层数。 插入全部 $m$ 个边后根据并査集中最高的所有 $n$ 个点被合并为一个点的层数确定实际操作次数,将所有连边层数超过实际操作次数的边的删除次 数设为 $-1$ 即可。 [code](https://oiclass.com/d/pu2ti/record/670ca368bf455e0511cee485) ### [oiClass #P2692. 采油](https://oiclass.com/d/pu2ti/p/P2692) 假设已经找到了一条最优的直线,将其平移直到不能再次移动,发现这条直线上一定存在至少一个端点。 枚举每一个端点,求出这个端点和其他端点所在直线的斜率(这两个端点的 $y$ 不能相等,不然斜率为 $0$ 不满足题目要求)。 将斜率从小到大排序,然后用类似扫描线的思路扫一遍,第一次遇到一条线段(即遇到这条线段的一个端点)时,将其价值加入,否则将价值减去。 注意,若许多点的斜率相等时,要先处理能加入价值的点。 [code](https://oiclass.com/d/pu2ti/record/66f2784c171ac891402a04f5) ### [oiClass #1184. 城堡保卫战](https://oiclass.com/d/pu2ti/p/308) 假设先杀死怪物 $i$ 比先杀死怪物 $j$ 更优,即 $(a_i+kd)(b_i+kd)+(a_j+(k+1)d)+(b_j+(k+1)d)\leq (a_j+kd)(b_j+kd)+(a_i+(k+1)d)+(b_i+(k+1)d)$。 拆一下括号在化简可得:$(a_i+b_i)kd+(a_j+b_j)(k+1)d\leq (a_j+b_j)kd+(a_i+b_i)(k+1)d$。 最后可得 $a_j+b_j\leq a_i+b_i$。 按照这个要求排序即可,然后设 $dp_{i,j}$ 表示枚举到第 $i$ 个怪物选择了杀死 $j$ 个怪物所消耗的最小生命值,这就是一个 $01$ 背包,$O(n^2)$ 解决。 询问的时候二分一下答案即可。 [code](https://oiclass.com/d/pu2ti/record/670ca3b4bf455e0511cee61a) ### [oiClass #P3676. 小明的树](https://oiclass.com/d/pu2ti/p/P3676) $树上连通块的性质:点数=边数+1$。 设操作了 $i$ 次,黑边有 $p$ 条,若所有未点亮的灯成为一个连通块,则 $n-i-p=1$。 若满足条件,答案为黑白边的条数。 线段树维护即可。 [code](https://oiclass.com/d/pu2ti/record/670ca320bf455e0511cee358) ### [P8576 「DTOI-2」星之界](https://www.luogu.com.cn/problem/P8576) 难调。 首先化简式子:$\prod\limits_{i=l}^r \binom{a_i}{\sum\limits_{j=l}^i a_j}=\frac{(\sum\limits_{i=l}^r a_i)!}{\prod\limits_{i=l}^r (a_i!)}$ 。 发现只需要维护 $(\sum\limits_{i=l}^r a_i)!$ 和 $\prod\limits_{i=l}^r (a_i!)$ 。 考虑分块,用并查集维护每一颗星星的亮度。 但是空间不够,可以将询问离线下来,一个块一个块的维护。 注意,这道题能预处理的都要预处理,比如说快速幂。 [code](https://www.luogu.com.cn/record/181170369) ### [oiClass #309. 脆弱易碎](https://oiclass.com/d/pu2ti/p/309) 这棵树在不停地减小,如何衡量减小了多少呢?直径! 观察发现,当树的直径大于 $2$ 时,如果操作直径外的点,就会使得直径减 $2$,如果操作直径的端点,就会使得直径减 $1$。 这就相当于有一堆石子,每人每次可以取 $1$ 个或 $2$ 个,问最后谁能取走最后一个石子。这就小学奥数题了。 所以直接把树的直径找出来就行了。注意直径为 $2$ 时并不能一次取完。 [code](https://oiclass.com/d/pu2ti/record/670ca416bf455e0511cee89b)