Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2) 题解

A - A Variety of Operations

  • \(c=d=0\),输出 \(0\)
  • \(c\not \equiv d\pmod 2\),输出 \(-1\)
  • 否则如果 \(c=d\) 输出 \(1\),不然输出 \(2\)

B - Take Your Places!

赛时:哈,答案可以到 \(10^9\)​,说不定可以叉。赛后发现自己 ans 初始值 \(10^9\)​,被自己的数据 Hack(捂脸)。

考虑如果奇数和偶数的个数相差超过 \(1\) 那么无解。然后答案一定是奇偶交错的。考虑吧当前序列和目标序列的奇数值的下标取出,第一个与第一个求距离,第二个之间求……加起来即为答案。\(n\) 偶数时有两个目标序列。

注意答案可能超过 \(10^9\),记得把答案初值设大。不够不需要开 long long

C - Compressed Bracket Sequence

比较难写的模拟。老套路左括号为 \(1\),右括号 \(-1\)。计算一个前缀和。

考虑同时再维护一个前缀和的最小值作为个数的限制。暴力枚举区间,先看看区间中间缺的能不能补上,然后算能凑出几个就行。复杂度 \(O(n^2)\)

D - Take a Guess

考虑重要结论:\(a+b=(a\operatorname{and} b) + (a\operatorname{or} b)\)

算出 \(2\sim n\)\(a_1+a_i\),最后算出 \(a_2+a_3\),解方程即可。

E - Equilibrium

考虑在两条原序列上,分别做前缀和,那么一次操作就是在一个后缀上加一。而对 \(b-a\) 做前缀和,那么就是一段段不相交区间减一。

那么答案很显然就是 \(b-a\) 前缀和的最大值!其实还好理解,每次消掉所有非零位置,而这些位置可以直接对应到一个合法操作上。

无解的情况就是前缀和的最小值不能为负数,或者说 \(\sum a\ne \sum b\)​。ST 表预处理最值,\(O(n\log n)\)

F - Sports Betting

\(U=\{1, 2, \cdots, n\}\)。主要思路很简单,就是枚举 \(S\subseteq U\) 作为 winners,使 \(S\) 中的连边作为一个强连通图。然后设 \(T=U-S\),计算 \(S\) 中的点全部连向 \(T\) 的概率即可。

考虑 \(S\) 构成一个强连通图的概率。相当于 \(1\) 减去不构成强连通图的概率。对于每一种不构成的,一定是某一个 \(T \subset S\),出现 \(T\) 到不了 \(S-T\) 的情况。为了不要算重我们假设 \(T\) 构成强连通图。那么记 \(f(S)\)\(S\) 点集构成强连通图的概率:

\[f(S) = 1-\sum_{T\subset S \land T\ne \varnothing} f(T)\prod_{x\in S\land x\notin T} \prod_{y\in T} \frac{a_x}{a_x+a_y} \]

答案就是:

\[\sum_{S\subseteq U} |S|\cdot f(S) \cdot \prod_{x\in S}\prod_{y\in U\land y\notin S} \frac{a_x}{a_x+a_y} \]

预处理逆元,时间复杂度 \(O(3^n\cdot n^2)\)

G - Gates to Another World

首先对于这种连通性判断,带上删除操作的,大多可以时光倒流,使删除被插入取代,方便后期并查集。

套用线段树模型(总区间 \([0, 2^n-1]\)),假设树是满的,考虑在每个非叶结点上,都将左右子树“叠合”并使对应位相连。不过直接建出满二叉树的话,边的复杂度是 \(O(2^n\cdot n)\)​ 的,不太能接受。

考虑动态开点线段树,仅保留线段树上我们操作中曾涉及的位置。输入满足一个位置不会被删除两次,这提供了很大的方便,我们可以直接套用区间覆盖的方法,时间 \(i\)​ 的操作就打上标记 \(i\)​。在操作前记得先对整棵线段树打上 \(m+1\)​​ 的标记表示默认留存到最后,如果之后被删除了就会被覆盖。

可以发现,如果我们正常的标记下传,在下传前补全缺的结点,这样得到的会是一个“完满二叉树”(即每个非叶结点都有两个儿子,不清楚是不是这么叫?),并且标记都在叶子处。这方便了我们的后续操作。

思考我们通过线段树实际上在做什么。原题中的删除区间 \([l,r]\) 的操作,其实就是将 \([l,r]\) 的点隔离出来。我们实际上将区间拆成了 \(O(\log (r-l+1))=O(n)\)​ 个点,相当于“压缩”了原图。压缩点内部很显然是全部连通的。

然后我们使每个非叶结点的左右儿子“对应位置连边”。在动态开点的线段树上,我们“叠合”了两棵子树。由于线段树不满,可能叶子间没有对应,即其中一棵在较浅处就是叶子了,另一棵下面还有儿子。这是因为较浅的那个被压缩了,我们只要将那个较浅的叶子和另一棵树的更深的叶子相连即可,实际上就是对应位相连的效果。由于我们的线段树是“完满”的,于是并不用担心缺儿子的问题。

边数的复杂度是和线段树层数以及叶子数相关的,为 \(O(n^2 m)\)​。一条边被加入当且仅当当前时间倒流到所连两点的删除时间的较小值。

对于询问,只要找到其所在压缩点,再查询压缩点间的连通性即可。复杂度 \(O(n^2 m\cdot \alpha)\)​,其中 \(\alpha\) 代表并查集的时间。

参考代码:https://strncmp.blog.luogu.org/solution-cf1556g

posted @ 2021-09-02 15:07  -Wallace-  阅读(221)  评论(0编辑  收藏  举报