Codeforces Round 888 (Div. 3)

比赛链接:https://codeforces.com/contest/1851

A. Escalator Conversations

题意:一个扶梯,共m阶,n人站,每个台阶高k,Vlad身高H,Vlad任意站,问有多少人站在这个扶梯上正好和Vlad齐平

满足abs(H - h[i]) % k == 0 && abs(H - h[i]) / k <= m - 1 && H != h[i]即可

B. Parity Sort

题意:给出一个序列,可以任意交换奇偶相同的数的位置,问能不能交换成有序序列

排序后的序列和原序列各位上的数的奇偶性相同则说明能成

C. Tiles Comeback

题意:给一条有n个块的路,检查是否从首开始到末尾结束有一条长为k的倍数且每k长度的段颜色相同的路线

特判首尾颜色相同的,只要有k个以上的同颜色的块即可;否则从首尾分别开始枚举即可,如果找到两个k长度且l < r的段,说明能成

D. Prefix Permutation Sums

题意:给你一个去掉一个数的前缀和数组,看看原数组是否有可能是1~n不重复的序列

特判缺的数可能是最后一个的情况,看看最后一个前缀和是否等于n * (n + 1) / 2,是的话可能缺最后一个,挨个求差分判断即可;
否则挨个求差分后,如果是1~n的序列,会有两种情况:有一个数重复出现或比n大(因为少一个前缀和,差分后成了两个数的和),如果只有一个数是这种情况,我们再判断是否能拆成两个还没有出现的数,这是成立的情况。
不成立的情况有两种:差分后大于n * 2 或小于等于0,排除即可。

E. Nastya and Potions

题意:有些药,Nastya想全得到,知道所有药的购买价格,知道一些药有无限储备,知道一些药能由一些药制成,求全得到的最小价格

有些药是只能买的,有些药能被制作出来,而制作出来需要一些药,很显然,是拓扑排序,让有无限储备的药价格等于0,过一遍拓扑更新价格再全加起来就行了

F. Lisa and the Martians

题意:给出一些数a[n]和一个k,对每个(\(a_i\) ^ x) & (\(a_j\) ^ x)
(其中i != j且\(x < 2 ^ k\)),求其最大值

我们分析这个式子,要求异或同一个数后的按位与,我们固定x不变,如果ai和aj某一位都是0,x这一位取1后这一位结果是1,取0这一位结果是0;如果都是1,x这一位取0后结果是1, 取1后结果是0;如果不同,x取0或1结果都是0。这说明越不相似,结果越小。
那么,我们怎么得到最相似的两个数呢?这里有一个结论,一个序列中二进制最相似的两个数也就是排序后相邻数异或最小的数
那么我们得到了最相似的两个数后,再去推x,也是按照上面的分析,对于x的每一位尽量让结果等于1即可,这个题不止一种解,输出一种即可。

G. Vlad and the Mountains

题意:n座山,其中有些山之间有路,从一座山到另一座山需要消耗高度差的能量,消耗能量可以为负数,对于每一次询问,求从u到v以初始能量e能否到达

如果从a到b,消耗\(h_a - h_b\),从a经过b到c,消耗\((h_a - h_b) + (h_b - h_c) = h_a - h_c\),也就是说从一座山到另一座山消耗能量不论是否相邻总是高度差,我们把\(max(h_1, h_2)\)作为边权。
如果我们想要从一条路通过,那么我们必须两座山都能达到,也即是我们到这座山消耗的能量h - ha小于等于能量e,也就是对于每座山,只要高度小于等于ha + e即可。
那么,如果要从a到b,那么在这条从a到b的路径上只要我们的能量能翻过最高的山,其他山也能翻过。
我们有了一个简单的思路,dfs出每条路径,如果\(e + h_a >= h_{max}\),说明能成。

但是,这样做显然会超时,我们换个思路。
基本推论不变,我们按需要能量从小到大去解决每个询问,我们对每个边权小于等于\(h_v + e\)的边进行枚举且只枚举一次(在之后的询问中不再枚举),我们使用并查集来判断连通性,如果最终没有联通,说明至少有一部分路径边权是比\(h_v + e\)大的,就走不通。
这和kruskal算法的思路有相似性,都是从小到大依次枚举边,使用并查集检查连通性

posted @ 2023-08-01 12:26  eternal_visionary  阅读(31)  评论(0编辑  收藏  举报