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\) 随便维护即可。
复杂度线性。
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)\),常数有点大就是了。
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}\) 。
这样我们就得到了转移:
统计答案就是上面的第三种情况要求贡献为 \(1\) ,所以令容斥系数为 \((-1)^{x+y}\) 即可得到:
这样就得到了 \(\mathcal{O}(n^4)\) 的做法。
瓶颈在于第三项,这是容易优化的:
其中 \(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)\),随便过。
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\),于是一定能匹配完!

浙公网安备 33010602011771号