Loading

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)\)

\(\bf{record}\)

B (Torus Loop)

题意

题面冗长,请查看 洛谷题面

题解

对于 每个中点选/不选 建立 \(2nm\) 个点,发现是一个 2-SAT 问题,并查集维护。

若有点合法,不合法在同一个连通块,则无解。

否则答案为 \(2^{\text{连通块个数}}\),直接求解即可。

\(\bf{record}\)

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)!}\),具体的:

\[f_i=\dfrac{1}{(i-q_i)!}\left(i!-\sum\limits_{1\le j<i}(i-q_j)!f_j\right) \]

然后 \([l,mid]\to [mid+1,r]\) 的半在线卷积,就是把 \(f_j\) 放到 \(q_j\),然后和阶乘卷一下就行。

复杂度 \(\mathcal{O}(n\log^2 n)\)

\(\bf{record}\)

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}\)

题解

Cover in

考虑将每个点设一个势能 \(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\) 即可。

\(\bf{record}\)

posted @ 2025-08-11 12:17  HaHeHyt  阅读(37)  评论(0)    收藏  举报