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, yopt1 ,你可以选 xy 当中某个非零的,减少 1opt2,让 x 增加 1Q1: 是否可以让 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=k1

a 数组下标在 [0,n1] 之间。
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[n1]

其中 原先的 a[n1] 出现在了第 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 @   陈聂  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示