Codeforces 441 (Div.1) 解题报告


A

题意:

给出一个N,求多少个数x小于N,x加上x的数位和等于N,N<=1e9

做法:

直接从N-1开始依次判断,显然答案个数有限。

B

题意:

N个硬币,初始状态为0,对于一排硬币,你每次从最开始扫到结尾,中途发现相邻两个硬币状态为1,0就要将其交换。现在不断将硬币状态变为1,问每次变完要扫多少遍。

做法:

每次做完一遍操作,都会将位置最靠后的1放到最后,假设我们已经知道有x个1,那我们只要统计在没扫之前已经有多少个1在最后,设为y,答案就是x-y+1。

C

题意:

有N个字符串,字符集大小为M,你可以将任意的字母变成小写,小写的字母字典序小于大写字母,问是否存在一种操作使得这个N个字符串,前一个串字典序小于等于后一个串。

做法:

先扫一遍所有字符串,找到相邻的串第一个不同的位置(如果相同,比较长度,前一个串长度大于后一个串直接无解),设字符为x,y。如果x大于y,那么x必须小写,同时y必须保持不变,如果x小于y,如果y小写,那么x也必须小写,这显然是一个图论模型,M个点分别代表M个字符,对于x小于y的情况,我们连一条y到x的有向边,表示y小写,x必须小写。首先处理完x大于y的情况,再从所有小写的字符的点出发dfs,dfs到的字符全都设成小写,最后检查一下是否冲突即可。

这道题只要转换成图论模型就非常简单了。

D

题意:

给定一个数列,求多少个区间满足区间内所有数或起来的值等于最大值。

做法:

容易想到对于每个可能的最大值计算它最左,最右延伸到的地方,对于每一位的0/1做前缀和,用二分答案就可得到。但这时遇到一个棘手的问题,如果区间内两个最大值相同,贡献就会重复计算,如何避免呢?这里的做法很值得借鉴,先求出整个区间的最大值,算完它的贡献后,根据它的位置将整个大区间分成两个小区间,再分别计算,这样递归下去就没问题了。

F

题意:

M个公主,N个王子,每个公主有两个中意的王子,公主只能和自己中意的王子结婚,王子则无所谓,每个公主一旦结婚,国王就会收获wi元,现在国王来安排婚姻,求他的最大收益。M,N<=2e5

做法:

显然是一个图论题,如果按照二分图来做肯定TLE。考虑一种神奇的建图方式,如果公主i喜欢的是王子x,y。我们将x,y连边,对于每个连通块,如果它的点数大于等于边数,则必定有解,否则必定无解。按照收益将公主从大到小排序,不断加边,用并查集维护连通块的状态,采取能加边则加边的贪心策略,这样肯定是最优解。这题的难点主要在于如何判断是否有解,不得不说这种建图思路太巧秒了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值