2019牛客暑期多校训练营(第五场)

本文深入探讨了竞赛编程中各种问题的解决策略,包括状态压缩动态规划、图论、离散数学、数据结构和算法优化等核心内容。文章详细解析了具体题目如Adigits2、Bgenerator1、Cgenerator2等的解决方案,涵盖了从基础知识到高级技巧的广泛内容。

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

RankSolvedABCDEFGHIJ
219/8013/10OØØØØØOØOØ

O: 当场通过

Ø: 赛后通过

.: 尚未通过

A digits 2

solved by viscaria


viscaria’s solution

把n头尾相连重复n个即可


upsolved by chelly


chelly’s solution

若要求最小,可以按照模n建图,跑最短路即可。也可以dp。

B generator 1

upsolved by viscaria


viscaria’s solution

10进制快速幂

C generator 2

upsolved by chelly


chelly’s solution

可以转化成求离散对数的问题。求an=c (mod p)a^n=c \ (mod \ p)an=c (mod p)的问题,可以设置一个MMM,将nnn写成n=xM−yn=xM-yn=xMy的形式,于是就变成了axM=c×ay (mod p)a^{xM}=c\times a^y \ (mod \ p)axM=c×ay (mod p)。所以可以预处理所有的aya^yay,然后枚举所有的axMa^{xM}axM。时间复杂度是O(pM+M)O(\frac{p}{M}+M)O(Mp+M),显然M=pM=\sqrt pM=p的时候时间复杂度最低,为O(p)O(\sqrt p)O(p)。但是这个问题里有qqqccc,所以直接BSGS的时间复杂度是O(q×p)O(q \times \sqrt p)O(q×p),会TLE。
实际上我们可以预处理左边的axMa^{xM}axM,对于每组ccc,枚举右边的c×ayc \times a^yc×ay即可。这样时间复杂度是O(pM+qM)O(\frac{p}{M}+qM)O(Mp+qM)。所以当M=pqM=\sqrt{\frac{p}{q}}M=qp的时候取到最小复杂度,为O(pq)O(\sqrt{pq})O(pq)

D generator 3

upsolved by chelly


chelly’s solution

注意到模数很小,所以循环节会很短,x和y的循环节分别是2e5范围。但是两维坐标的循环节可能会高达4e10。
实际上,对于每个y,我们只需要保留最小的x和最大的x即可。问题就变成了如何对于每个y,快速求出其对应的最小的x和最大的x。
我们可以先求出x和y的循环节,并把前面不在循环里的部分对齐。然后就可以按照lxl_xlxlyl_yly按照剩余系进行分类。如果没有nnn的限制,显然对于一个yiy_iyi,就是求剩余系里的那些位置的最小值/最大值即可。现在有了nnn的限制,实际上就是求这个剩余系里按顺序的前kkk个中的最大/最小。直接RMQ即可。

E independent set 1

upsolved by chelly


chelly’s solution

状压DP
dp[S]表示S集合表示的子图的最大独立集大小,转移的时候枚举S的最高位1进行转移即可。可以从小到大递推求出每个数字最高位的1的位置。
时间复杂度O(2n)O(2^n)O(2n)

F independent set 2

upsolved by chelly


chelly’s solution

等价于求补图的最大独立集,补图实际上是二分图。所以直接二分图匹配求最大独立集即可。

G subsequence 1

solved by viscaria


viscaria’s solution

H subsequence 2

upsolved by chelly


chelly’s solution

直接拓扑排序即可

I three points 1

solved by viscaria


viscaria’s solution

J three points 2

upsolved by chelly


chelly’s solution

考虑路径的交点OOO,那么OX,OY,OZOX,OY,OZOX,OY,OZ的长度分别都能算出来,然后树dpdpdp可以求出以每个点为OOO,最长的三个分叉。然后就是一个三维数点问题了。

Dirty Replay

  • F题补题的时候WA了2发,原因是没有正确的输出二分图最大独立集的方案。
  • J题补题的时候WA了几发,原因是有个地方忘记了排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值