ARC196 做题记
A (Adjacent Delete)
题意
给你一个长度为 \(N\) 的数列 \(A=(A_1,A_2,\cdots,A_N)\)。
你需要重复删除数列中的相邻两个元素直到数列长度 \(<2\),每次删除的得分是删除的两个元素的差的绝对值。
你的最终得分是所有操作的得分之和。请你找出可能的最大得分。
\(2\le N\le 3\times 10^5,A_i\in [1,10^9]\)
题解
发现当 \(N\) 是偶数的时候答案能取到 上确界,即最大的 \(N/2\) 个减最小的 \(N/2\) 个。
否则枚举最后剩下的元素,对顶堆维护前后缀最大的 \(N/2\) 个减最小的 \(N/2\) 个。
复杂度 \(\mathcal{O}(n\log n)\)。
B (Torus Loop)
题意
题面冗长,请查看 洛谷题面。
题解
对于 每个中点选/不选 建立 \(2nm\) 个点,发现是一个 2-SAT 问题,并查集维护。
若有点合法,不合法在同一个连通块,则无解。
否则答案为 \(2^{\text{连通块个数}}\),直接求解即可。
C (Strongly Connected)
题意
初始有一个包含 \(2N\) 个顶点的链,\(1\to 2\to \cdots \to 2N\)。
给定一个由 \(N\) 个 W 和 \(N\) 个 B 组成的长度为 \(2N\) 的字符串 \(S = S_1S_2\ldots S_{2N}\)。\(S_i\) 表示点 \(i\) 的颜色。
你需要进行如下操作:
-
将 \(2N\) 个顶点分成 \(N\) 对,每对包含一个白色顶点和一个黑色顶点。
-
对于每一对,添加一条从 白色顶点指向黑色顶点 的 有向边。
请计算有多少种分组方式,使得最终得到的图是强连通的。将答案对 \(998244353\) 取模后输出。
\(2\le N\le 2\times 10^5\)
题解
显然强连通等价于 \(2N\) 可达 \(1\)。
考虑对于前缀重定义一个合法性,然后记前缀合法方案为 \(f_i\)。
转移就是 \(f_i\) 通过总方案数减不合法,就找到 \(1\le j<i\),钦定 \(1\sim j\) 是第一个合法的前缀,通过 \(f_j\) 转移。
规定一个段以白点结尾。可以合法的前缀中每个黑点都要被前缀中的白点匹配,即前缀中白点数要多于黑点。
记白点的位置为 \(p_1,p_2,\cdots,p_n\),重定义 \(f_i\) 表示 \([1,p_i]\) 中合法的方案。
\([1,p_i]\) 中有 \(i\) 个白点,\(q_i=p_i-i\) 个黑点。
一个前缀的匹配方案为 \(\dfrac{i!}{(i-q_i)!}\)。
钦定 \([1,j]\) 合法,则 \([j+1,i]\) 中的黑点要找剩余白点匹配。
即 \(\dbinom{i-q_j}{q_i-q_j}(q_i-q_j)!=\dfrac{(i-q_j)!}{(i-q_i)!}\),具体的:
然后 \([l,mid]\to [mid+1,r]\) 的半在线卷积,就是把 \(f_j\) 放到 \(q_j\),然后和阶乘卷一下就行。
复杂度 \(\mathcal{O}(n\log^2 n)\)。
D (Roadway)
题意
\(n\) 个点排成一条线,由 \(n-1\) 条边顺次连接。有 \(m\) 个人,每个人从 \(s_i\) 走到 \(t_i\),初始其体力为 \(0\),经过一条边权为 \(w_i\) 的边后体力会加上 \(w_i\)。
每个人都想使得走到 \(t_i\) 时体力是 \(0\) 且每个中间点的体力都是 正整数。
\(Q\) 次询问,每次问只考虑 \([L_i, R_i]\) 的人,是否有一种给边赋权的方案使得满足每个人的要求。
\(n, m, Q \le 4 \times 10^5,|s_i - t_i| > 1,\forall i<j:(s_i, t_i) \neq (s_j, t_j)\)。注意不保证 \({s_i < t_i}\)。
题解
考虑将每个点设一个势能 \(v_j\),连接 \(i, i+1\) 的边权 \(w_i = v_{i+1} - v_i\)。
那么若一个人 \(s_i < t_i\),其限制转化为 \(v_{s_i} = v_{t_i}, \forall j \in (s_i, t_i), v_j > v_{s_i}\)。如果 \(s_i > t_i\) 就是 \(v_j < v_{s_i}\)。
那如果只有 \(s_i < t_i\) 怎么做?每个 \((s_i, t_i)\) 不能有相交的边,可以包含。形式化的说,对于每个 \((i, j)\) 都要满足以下条件之一:
- \(t_i \le s_j\) 或 \(t_j \le s_i\)
- \(s_i < s_j < t_j < t_i\) 或 \(s_j < s_i < t_i < t_j\)
我们称其为条件 \((*)\)。
若有一对 \((i, j)\) 不满足 \((*)\),不妨设他们端点从左到右是 \(s_i, s_j, t_i, t_j\),那根据限制有 \(s_j > s_i \Rightarrow t_j > s_i \Rightarrow s_j > s_j\),是不合法的。
若都满足 \((*)\),则相离的区间互不干扰,包含的区间大小关系是确定的,所以一定存在解。
如果同时有 \(s_i < t_i\) 和 \(s_j > t_j\):
- 只考虑 \(s_i < t_i\) 的人要满足 \((*)\)。
- 只考虑 \(s_i > t_i\) 的人要满足 \((*)\)。
- 首先对于任意不同方向的 \((i, j)\) 有 \(s_i \ne t_j\) 且 \(s_j \ne t_i\)。
否则在两区间相等的边缘处的势能一定无法满足。
例如说 \(s_i < t_i, s_j > t_j, s_i = t_j\) 设 \(x = s_i = t_j\),那 \(i\) 要求 \(v_{x+1} > v_x\),\(j\) 要求 \(v_{x+1} < v_x\),这是矛盾的。
这三个条件都是合法的必要条件,而他们三个加起来也是充要的。
考虑一个 \(n\) 个点 \(m\) 条边的有向图,每条边从 \(s_i \to t_i\)。
对于一个 \(s_i < x < t_i\) 的点 \(x\) 我们称 \(x\) 被这条边覆盖。
如果暂时把每条边看做无向边,则这个图可以切割成若干联通块,每个联通块内的边连在一起形如 \(a \leftarrow \dots \leftarrow d \leftarrow x \rightarrow e \rightarrow \dots \rightarrow g\)(可能不存在向左或向右的延伸)。我们称它为一条路径。
一条路径的最左顶点为 \(l\),最右为 \(r\)。
\([l, r]\) 不交的两条路径呈趋势其势能之间没有限制。考虑相交的两条路径 \((i, j)\),设 \(l_i < l_j < r_i < r_j\),如果 \(i\) 中覆盖 \(l_j\) 的那条边 \(k\) 满足 \(s_k < t_k\) 则 \(i, j\) 的大小关系是 \(i < j\),否则是 \(i > j\)。
假设是 \(i < j\),那么对于 \(j\) 覆盖的某个点 \(x\),若覆盖 \(x\) 的那条边是 \(s_p < x < t_p\),那么根据上述条件的限制,\(i\) 中覆盖这个点的边肯定是 \(s_q < x < t_q\)。符合 \(i < j\) 的关系,反之亦然。
所以各个路径之间的大小关系可以的到一个 DAG,并以此确定解。
在判断合法时第三个条件容易检查,第一二个条件可以使用 BIT 维护 xor-hash 来解决,具体可见代码。
双指针的对于每个 \(r=1 \sim i\) 处理最远的合法左端点 \(f_r\),在询问时判断是否 \(l \ge f_r\) 即可。

浙公网安备 33010602011771号