codeforces做题 记录

本文记录了作者在Codeforces上解决博弈论和图论问题的经验,包括如何判断博弈胜负、二分图的判断方法以及复杂度优化策略。通过分析1033G、1033F、1033E等题目,分享了思考过程和简化问题的技巧,强调在遇到类似问题时不要过度复杂化,有时简单的枚举和贪心策略就能解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1033 G 题意是 给 n堆 石子 Alice 和 Bob 游戏 Alice 每次可以在一堆中取出a枚石子,Bob可以在一堆中取出b枚石子,求对于a 属于 [1,m] b 属于[1,m] 有多少对 <a,b> 满足 1)Alice必胜 2)Bob必胜
3)先手必胜 4) 后手必胜

这一类 博弈题 考虑 每堆对于 (a+b)的余数即可, 像这种 双方在对手操作后总可以再进行一步操作达到某个特定效果的题,这么考虑。
然后细节方面比较繁琐,一开始我写了一个 set 的模型, 常数非常大,设关键点比较复杂。 后来 看了一下VooV的 考场代码。
他维护了3) 和 4) 这样只需要考虑 a和 b 在同一区间的情况。 对于这种情况只需要考虑 2*a 的 限制就可以,细节比较少,写也很方便。 这种 维护的题目可能维护一些特定的东西 能够有一些优美的性质来优化写法。

1033 F 题意 n个w位的模板串 m次询问,每次给出一个长度为w的逻辑运算符串,让你求多少对数 按位做串上的操作能够得到 0.

复杂度 m*(2^w)想到复杂度 标算是 总共三种情况,直接利用和的方式表示。 比如说 一个0 一个 1 和1为1 ,这样一个为0 至多表示为2种不同的和。这样就可以做了。下次这种题 要敢于些这种复杂度。
还有一种留空白的方法其实也是差不多的,就是优化状态。
1033 E 题意 每次可询问一个点集内的边数,让你用 O(n log n) 次询问判断出这个图是否是一个二分图。 n 500 无重边 无自环。
考虑构造二分图的几个方法, 直接搜点集不靠谱,这里只能先构造一个生成树。 我们对这个图 进行dfs,我们可以O(log n)次询问 问出一条边,然后继续搜索。 这样子 共用了 O(n log n) 剩下的 随便做。
497 B Tennis Game
题意 : 两个人下棋,规则是双方不停的下棋直到一个人胜出了s场,将双方战绩清零这个人赢下一轮,当赢下t轮时获得比赛胜利,比赛立即结束
现在按时间顺序给出比赛对局结果。 求有多少对s,t满足比赛局面可以是输入的对局结果。 n 1e5

这个题我考试的时候居然没有想出来。。。
总的来说一看就不是很好维护所以说直接枚举s然后我们 O(轮数)就可以了,这显然可以用一个vector O(1)维护,下次遇到这种题不要想复杂。

C n 场 歌剧 每一场要歌唱 li-ri的 曲调,每个歌手只能够唱ai-bi之间的曲调,只愿意唱ci场。
问你是否可以 唱完每场歌剧。

n 1e5

这个题考虑如何把二维转成一维,只需要排序之后贪心。 套路。

E 一道 不是很难完全有可能自己想出来的题。
给你一个长度为n的序列a0,a1…an-1 ai为i在k进制表示下的数位和mod k滞后的值。 求a有多少个不同的子序列。 n 1e18 k 30
首先子序列的个数计算可以用dp dp[i]表示最后一位 为 i 的不同子序列个数。
这样子简单的考虑之后发现转移一个字符i是,dp[i]变为当前的不同子序列个数之和,剩下的dp值不变。
然后就是一个进制题目的套路,先考虑 k^(m-1) 以内的结果,然后考虑在前面加上一位会发生什么。
我们用 Mat[i][j] 表示 k^j 每个数全部多了加了一个i的转移矩阵。
显然 Mat[i+1][j] = π (Mat[i][j] * Mat[i][j + 1] * … * Mat[i][(j +k-1) % k] 利用前后缀的小技巧优化转移就可以做到 O(k ^ 4 * log k n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值