题解

A Qfish的魔方

记录每个数的个数,判断每个数的个数是否恰好为3个。

B 寻找最大值

题目意思是求可以交换交换两个位置能够得到的最大值。因为我们只能进行一次交换操作,为了使得交

换后的值最大,我们需要把尽可能大的数字从后面交换到前面来,所以只需要从第一位往后找到不是最

大值的第 x 位,再往后找到值最大的第 y (1 ≤ x < y n),交换 x, y 位置的数字,得到的值即

是最大值。

C 找数字

找数字:记录一下数字出现的次数,输出只出现一次的数字。

D 找更多数字

从高位往低位找到第一个不为0的位置,分成两堆数字,两堆数字的异或和就是两个只出现一次的数

字,记录一下前缀异或和,就可以快速回答询问。

E 井字棋

判断有没有一行全为'X',有没有一列全为'X',有没有一个对角线全为'X',满足其中一个条件,则是先手

赢,否则后手赢。

F 不匹配子串

两个字符串长度均小于等于500。考虑一个字符串的子串数量只有n(n 2 +1)个。所以可以暴力存下字符串

s的所有子串,然后将这些子串和字符串r进行匹配,若匹配的两个字符串长度相等且有k个位置的字符

不同,则满足条件的子串数量加一。时间复杂度O(n 2m)n代表字符串s长度,m代表字符串r长度。当然也可以不存子串,直接在字符串s上匹配,这样的时间复杂度O(nm)1 ≤ n ≤ 500 1 ≤

m ≤ 500上述两种写法均可通过。

G 猫猫的天空城

使用并查集,虽然有n张图,但nm总点数不超过1e6,可以对这nm个点重新编号。

对于删边操作,如果直接按照给定的顺序删边,难以更新合并连通块。这里可以用倒序的思想,将所有

询问保存下来,从后往前处理。

合并时,删除的边不参与。然后从后往前将操作中删除的边加入进去,并更新合并的连通块,然后进行

对应的查询操作。

H 猫猫魔法

按照题意模拟即可,主要考查了字符串

I 发糖果

首先,对于函数F(S ′ , m),可以抽象成一张二分图,对于每个人而言,对能给他发糖果的天都连上一条

边,那么函数F(S ′ , m)即为子图的最大匹配数。而对于S的每一个子集S ,都需要做一遍二分图匹配是

做不到的,需要做2 n次二分图匹配。

根据拓展hall定理:

Hall 定理:

对一个二分图 G=(V1,V2,E),对 S V1 f(S) S 连到 V2 的点集大小,则存在 V1 的完美匹配(即

大小等于 |V1| 的匹配)当且仅当对任意 S V1 都有 |S| ≤ |f(S)|。(要求右部的话,交换 V1,V2 即可)

扩展 Hall 定理:

M = max_{S V1} {|S| - |f(S)|},则 G 的最大匹配为 |V1| - M。(对左右部件用这个定理都可以得到

最大匹配)

我们可以得知,一个集合最大匹配数与它的子集的点数与连接的点数是相关的,这部分可以通过sosdp

进行转移。那么我们只需要知道该集合的点数与连接的点数,就可以得到每个子集的最大匹配数。

但是并不好获得子集的点数与连接的点数,这里需要用到一点容斥,将总的天数减去与该子集完全有无

连边的天数即是与该子集有连接的天数。这里同样用到一次sosdp。通过两次sosdp,对于该2 n个子图,我们都可以得到最大匹配数,将所有的最大匹配数相加即可。

欧拉筛预处理质数,通过一个二分check即可得到最小的m,或者不可能。当kn*2 n以内时,可以有

解。

J 黑白黑

假设白布中有黑色污渍,那么矩阵中一定有一行从左到右出现了1之后会出现0然后又出现1,以此判断

即可。

或者可以用DFS+计数的方法,遍历矩阵数一下黑色0的个数cnt,再从边界开始DFS数一下白布外0的个

x,比较一下,若cnt=x,输出No;若cnt>x,输出Yes

全部评论

相关推荐

牛客532105025号:教育背景、个人技能太长,项目没有。粗看没有内容,细看大杂烩。没有获奖啥的吗,个人技能感觉像是几分钟写出来的。简历还有很大的进步空间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务