Loading

ARC193 做题记

A (Complement Interval Graph)

题意

给定 \(N\) 组区间 \((L_1, R_1), (L_2, R_2), \ldots, (L_N, R_N)\)。如下定义无向图 \(G\)

  • \(\forall i, j \in [1, N]\)\((i,j)\) 有边当且仅当 \([L_i, R_i]\cap[L_j, R_j]=\varnothing\)

每个顶点 \(i\) 有权重 \(W_i\)\(Q\) 次询问 \((s_i,t_i)\),求 \(s_i\to t_i\)\(G\) 上的点权最短路。

\(1 \leq N,Q \leq 2 \times 10^5,1 \leq L_i \leq R_i \leq 2N,1 \leq s_i, t_i \leq N,s_i\neq t_i,W_i\in [1,10^9]\)

题解

注意到答案一定不超过 \(3\),否则无解。

画画图,各个情况分讨,用个啥前后缀 \(\min\) 随便维护即可。

复杂度线性。

\(\bf{record}\)

B (Broken Wheel)

题意

给定一个正整数 \(N\) 和长度为 \(N\)\(01\)\(s\)

考虑由编号为 \(0, 1, 2, \ldots, N\)\((N+1)\) 个顶点和以下边构成的简单无向图 \(G\)

  • \(\forall i\in [0,N-1]\)\((i,(i+1)\bmod N)\) 连边。

  • \(\forall i\in [0,N-1],s_i=1\)\((i,N)\) 连边。

接下来,将 \(G\) 的每条边任意定向以构造有向图 \(G'\)。即,对于 \(G\) 中的每条无向边 \(\{u, v\}\),将其替换为有向边 \((u, v)\)\((v, u)\) 中的一种。

\(G'\) 中顶点 \(i\) 的入度为 \(d_i\)。求可能得到的序列 \((d_0, d_1, \ldots, d_N)\) 的数量对 \(998244353\) 取模的结果。

\(3 \leq N \leq 10^6\)

题解

直接考虑判定的形式,应该比较优美。显然忽略 \(d_n\)

首先考虑怎么判定一个序列 \(d\) 是否合法。

如果 \(s=0\),即没有连向 \(n\) 的边的话,合法当且仅当去掉 \(d\) 中的 \(1\) 后,\(d\) 是一个 \(0,2\) 间隔排布的环。

再考虑那些连向 \(n\) 的边,它们的作用就是可以给某个 \(d\) 减去 \(1\)

直接对这个写 ddp 即可,复杂度 \(\mathcal{O}(n)\),常数有点大就是了。

\(\bf{record}\)

C (Grid Coloring 3)

题意

给定一个 \(H\)\(W\) 列的网格,初始时所有单元格均为无色。

你可以按照以下步骤进行任意次数的操作:

  • 首先选择 \(1\)\(C\) 之间的整数 \(i\) 和一个单元格。

  • 随后,将选中的单元格,与选中单元格同行同列的所有单元格用颜色 \(i\) 进行覆盖涂色(若单元格已有颜色,则会被颜色 \(i\) 覆盖)。

请计算通过上述操作得到的 所有单元格均被涂色 的网格可能的不同状态数量,结果对 \(998244353\) 取模。

\(1 \leq H, W \leq 400,1 \leq C \leq 10^9\)

题解

这种题感觉 ARC 出了一大篓子。

时光倒流,考虑判定。

判定是 第一次 删一个同色的十字,之后 每次可以删同色的行、列、十字,能删空就合法。

\(f_{i,j}\) 表示 \(i\)\(j\)​ 列的网格中,能通过删同色的行、列、十字删空的个数。

转移时找到同色的位置集合,随便删一个的话会算重,考虑每次钦定一个子集删掉,容斥计算答案。

ps:根据 le0n 所说,这个容斥是一个 DAG 容斥,就把覆盖关系看成 DAG,系数也是 \((-1)^{\cdots+1}\)

对于一个网格,有两种情况:同色位置的集合中只有行或只有列、同色位置的集合中同时有行和列。

对于同色位置的集合中恰好只有 \(k\) 行的情况,钦定 \(j\) 行同色,容斥系数是 \((-1)^{j+1}\) 。列的情况是相同的。

对于同色位置的集合中恰好有 \(i\)\(j\) 列的情况,在只钦定行和只钦定列的时候已经被算了两次,所以我们需要在同时钦定行列的时候让它的贡献为 \(-1\)

钦定 \(x\)\(y\) 列同色,可以得到容斥系数是 \((-1)^{x+y+1}\)

这样我们就得到了转移:

\[f_{i,j} = \sum_{x=1}^i (-1)^{x+1} \binom{i}{x} C^x f_{i-x,j} + \sum_{y=1}^j (-1)^{y+1} \binom{j}{y} C^y f_{i,j-y} + \sum_{x=1}^i\sum\limits_{y=1}^j (-1)^{x+y+1} \binom{i}{x} \binom{j}{y} C^{x} f_{i-x,j-y} \]

统计答案就是上面的第三种情况要求贡献为 \(1\) ,所以令容斥系数为 \((-1)^{x+y}\) 即可得到:

\[ans = \sum_{i=1}^n \sum_{j=1}^m (-1)^{i+j} \binom{n}{i} \binom{m}{j} C^{n-i,m-j} \]

这样就得到了 \(\mathcal{O}(n^4)\)​ 的做法。

瓶颈在于第三项,这是容易优化的:

\[\begin{aligned} &\quad\ \sum_{x=1}^i\sum\limits_{y=1}^j (-1)^{x+y+1} \binom{i}{x} \binom{j}{y} C^{x} f_{i-x,j-y} \\ &=\sum_{x=1}^i(-1)^{x+1}\binom{i}{x}\sum\limits_{y=1}^j (-1)^{y}\binom{j}{y} C^{x} f_{i-x,j-y} \\ &=\sum_{x=1}^i(-1)^{x+1}\binom{i}{x}g_{i,j} \end{aligned} \]

其中 \(g_{i,j}=\sum\limits_{y=1}^j (-1)^{y}\dbinom{j}{y} C^{x} f_{i-x,j-y}\),对于每个 \(f\) 贡献到 \(g\) 即可。

总复杂度 \(\mathcal{O}(n^3)\),随便过。

\(\bf{record}\)

D (Magnets)

题意

给定两个长度为 \(N\)\(01\)\(A,B\)

\(N\) 个单元格从左到右排成一列。初始时在 \(A_i = 1\) 的所有单元格 \(i\) 放置 \(1\) 个棋子,其他不放。

你可以进行任意次数(包括 \(0\) 次)的以下操作:

  • 首先选择整数 \(1\le i\le n\)

  • 然后,将所有棋子同时向单元格 \(i\) 靠近的方向移动 \(1\) 个单元格。

    具体规则如下:设某个棋子移动前的位置为单元格 \(j\),移动后的位置为单元格 \(j':\)

    • \(i < j\),则 \(j' = j - 1\)
    • \(i > j\),则 \(j' = j + 1\)
    • \(i = j\),则 \(j' = j\)

请判断是否可以通过上述操作使网格满足以下条件,若可能,还需输出达成该条件所需的 最小操作次数

  • \(\forall i\in [1,n]\),当且仅当 \(B_i = 1\) 时,单元格 \(i\) 中存在至少 \(1\) 个棋子。

\(T \leq 2 \times 10^5\) 组多测,\(\sum N\le 10^6\),保证 \(A,B\) 串中都至少有一个 \(1\)

题解

这种纯分析的题,对我来说感觉有点小困难。

考虑刻画这个向中靠齐的操作。

考虑中间两侧相对位置几乎不变,唯一的改变是 \(i-1, i, i+1\) 都得到了 \(i\) 位置。

那就相当于 \(a_i \leftarrow \max\{a_{i-1}, a_i, a_{i+1}\}\) 并删去 \(a_{i-1}, a_i, a_{i+1}\) 重新编号。

为了防止一些越界问题,可以考虑在操作前在序列头尾各放一个不会影响的 \(0\)

那么就可以把操作刻画成:在序列头尾各放上一个 \(0\) ,选取 \(3\) 个连续的数合并成这 \(3\) 个数的 \(\max\)

但是直接考虑合并成 \(b\) 还是有点困难,于是尝试去二分 \(k\) 次操作 check。

此时就不用考虑每次操作时放 \(0\) 了,而是考虑提前在 \(a\) 的头尾放上 \(k\)\(0\) ,这样的好处就是 \(a\) 被固定好了。

因为每次合并是 \(3\) 个元素,所以可以知道 \(b\) 中的每个元素一定是对应的 \(a\) 中的奇数个元素。

于是再对 check 进行转换:把 \(a\) 划分成 \(n\) 个段,满足每个段的长度都为奇数,且段中元素 \(\max\) 等于 \(b\) 中对应元素。

首先考虑调整, \(b_i = 0\) 说明其对应的段肯定都为 \(0\) ,那么若其段长不为 \(1\) ,把多出的部分用给周围的段(只要甩出去的是偶数即可)一定也合法,所以 \(0\)\(a\) 中对应的也一定是个单 \(0\)

于是考虑以下 check:

  • 按顺序由 \(1 \to n\) 遍历 \(b_i\)

  • 对于 \(b_i = 1\) ,一直扩张到区间中含有 \(1\)

  • 对于 \(b_i = 0\) ,缩成一段考虑,这是因为 \(0\)\(1\) 是完全不可的态度。

所以对于长度为 \(m\) 的段,一直扩张之前的段直到接下来 \(a\) 中存在长度为 \(m\)\(0\) 段,选择这个全 \(0\) 段。

此时就应该有了 \(\mathcal{O}(n \log n)\) 的做法,不过还可以再优化。


考虑答案的下界, \(b\) 的前缀 \(0\) 必须匹配 \(a\) 的前缀 \(0\)\(b\) 的后缀 \(0\) 必须匹配 \(a\) 的后缀 \(0\) ,于是下界 \(x\)\(b\) 的前缀 \(0\) 个数减去 \(a\) 的前缀 \(0\) 个数和后缀 \(0\) 个数同样的值 (还有 \(0\)) 取 \(\max\)

那么会发现,对于 \(x+2\) , check 时其实也就是让 \(b\) 第一个 \(1\) 的区间左端点扩展了 \(2\)\(b\) 最后一个 \(1\) 的区间右端点扩展了 \(2\) ,其余都一样。

也就是说, \(x\)\(x+2k(k \ge 1)\) 的 check 后的结果是相同的。

同样的, \(x+1\)\(x+2k+1(k \ge 1)\) 的结果是一样的。

所以只需要代入 \(x, x+1\) 去 check,时间复杂度 \(\mathcal{O}(n)\)


有点小疑问?

考虑 check 之后如果 \(a\) 中剩下若干 \(1\) 没匹配,\(b\) 中最后一段是全 \(0\),此时会出事嘛?

考虑把 \(b\)\(0\) 前面那个 \(1\) 匹配到剩下的最后一个 \(1\),然后 \(b\) 中最后一段 \(0\) 匹配 \(a\) 的后缀 \(0\)

由于我们 check 添加了足量的 \(0\),于是一定能匹配完!

\(\bf{record}\)

posted @ 2025-08-29 12:13  HaHeHyt  阅读(38)  评论(0)    收藏  举报