Pinely Round 2 (Div. 1 + Div. 2) / Codeforces contest 1863 题解

难度:D << B < C << A

Problem A. Channel

https://codeforces.com/contest/1863/problem/A

流程看起来很复杂,让我们重述一下题意。

两数 \(x\), \(y\)\(opt1\) ,你可以选 \(x\)\(y\) 当中某个非零的,减少 \(1\)\(opt2\),让 \(x\) 增加 \(1\)\(Q1 :\) 是否可以让 \(y\) 变成 \(0\) , $Q2 : $ 是否可以使让 \(y\) 不变成 \(0\)

\(A1:\) 贪心地,尽可能选 \(y\),模拟。
\(A2:\) 贪心地,尽可能选 \(x\),模拟 。

Problem B. Split Sort

https://codeforces.com/contest/1863/problem/B

让我们从一个连续段的视角看这个问题。

\(10\) \(19\) \(7\) \(1\) \(17\) \(11\) \(8\) \(5\) \(12\) \(9\) \(4\) \(18\) \(14\) \(2\) \(6\) \(15\) \(3\) \(16\) \(13\)
\([1,3]\) * * *
\(4\) *
\([5,6]\) * *
\([7,9]\) * * *
\([10,13]\) * * * *
\([14,16]\) * * *
\([17,18]\) * *
\(19\) *

每次选尽可能长的下标递增的值连续的段。
考虑分成两段,值分别是 \([1,10]\), \([11,19]\)
观察 \([1,10]\)

\(10\) \(7\) \(1\) \(8\) \(5\) \(9\) \(4\) \(2\) \(6\) \(3\)
\([1,3]\) * * *
\(4\) *
\([5,6]\) * *
\([7,9]\) * * *
\(10\) *
发现连续段的相对位置是不变的。

那么,像 \([1,10][11,19]\) 这样的划分,会导致连续段个数不变;像 \([1,13][13,19]\) 这样的划分,会导致连续段个数 \(-1\)(因为\([10,13]\)变成了前半部分的末尾,\([14,16]\)变成的后半部分的开头,可以拼起来);

那么答案当然是 连续段个数 \(-1\)

Problem C. MEX Repetition

https://codeforces.com/contest/1863/problem/C
第一轮暴力(可以用std::set维护未出现的数)。发现a的元素的值变成了\([0, n]\)范围内的不同数。

对于之后的 \(t = k - 1\)

\(a\) 数组下标在 \([0,n-1]\) 之间。
\(a[n]\) 成为 \(a\) 数组在 \([0,n]\) 中未出现的那个数。

对于一轮操作,
\(a[0]\) 变成了未出现的 \(a[n]\);由于 \(i=0\) 时把 \(a[0]\) 删掉了,缺失的数变成了 \(a[0]\),因此 \(a[1]\) 会变成 \(a[0]\)。依次执行下去, 数组变成了

\(a[n]a[0]a[1]a[2],...,a[n - 1]\)

其中 原先的 \(a[n - 1]\) 出现在了第 \(n\) 位,表示没出现的数。

执行 \(t\) 次之后,数组变成
\(a[(-t)\mod(n + 1)]a[(-t + 1) \mod (n + 1)],...,a[(-t + n) \mod (n + 1)]\)

那么答案是数组前 \(n\)

Problem D. Two-Colored Dominoes

https://codeforces.com/contest/1863/problem/D

横向的多米诺骨牌是不影响每行的 黑白个数差的,因为黑白各贡献一个。
因此每行的 黑白个数差是由纵向的多米诺骨牌构成的。

考虑跨第一行第二行的纵向多米诺骨牌。
如果有偶数个,那么可以任意分配其中一半,在第一行涂白色;另一半,在第一行涂黑色。奇数个是不行的。
如果涂色成功,那么对第二行是没有影响的。不妨去掉这些骨牌。那么继续在第二行递归地做就可以了。

对每一列的 黑白个数差 同理。

posted @ 2024-12-18 15:12  陈聂  阅读(88)  评论(0)    收藏  举报