2024牛客寒假训练营(py-DC)

2024牛客寒假训练营(py-DC)

写在前面

​ D题可以预处理+DP来做,如果想到用图论做,想到怎么建图,可以用最短路写;C题是一种带点排列组合,需要用01Trie维护信息,要会乘法逆元(好像看到一个佬用二分ac了,没看懂代码);G线段树进行区间信息维护。

D-Tokitsukaze and Slash Draw_2024牛客寒假算法基础集训营2 (nowcoder.com)

题意

D

题目分析

​ 出题人题解是给了DP和最短路两种做法,这里给出最短路的思路和python实现

  • 首先,题目要我们求的是最少的 c o s t cost cost 使目标卡出现在最上方,是一个最优化问题,其实看到这就应该往DP,贪心,最短路等上面想的,我却在想多元一次同余方程,显然是本蒟蒻做题少的锅QAQ。
  • 看看往图论那边想,我们显然可以将 b i b_i bi 这个花费当作边权。那么我们怎么连边呢?
  • 根据题意,在 % n n n 的背景下,每一张牌都可以从原位置 x x x x + a i x+a_i x+ai ,那么我们就以位置为点, b i b_i bi 为边权,在这两点间连一条边( 建图的时间复杂度为 O ( n m ) O(nm) O(nm) )。
  • 我们的答案为以 k k k 为起点的 d i s t [ 0 ] dist[0] dist[0],跑一遍 Dijkstra 即可

python ac code

代码查看 (nowcoder.com)

注:用普通的 Dijkstra 会比堆优化的复杂度更优

C-Tokitsukaze and Min-Max XOR_2024牛客寒假算法基础集训营2 (nowcoder.com)

题目大意

C

题目分析

  • 根据题意,我们可以想到一种比较暴力的做法,先将 a a a 数组排序,枚举所有的 m a x max max 再枚举所有的 m i n min min , 将满足条件的 m a x 和 m i n max和min maxmin 加到 a n s ans ans 里面来,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 其中贡献的计算是,我们确定了 m a x max max m i n min min 后,那么在这两个值之间的所有数,我们可以选择选or不选两种,所以,如果该组 m a x max max m i n min min 满足 X o r Xor Xor 小于 k k k,则贡献是 2 i − j − 1 2^{i-j-1} 2ij1 可拆成 2 i − 1 / 2 j 2^{i-1}/2^j 2i1/2j 所以我们把每一个 1 / 2 j 1/2^j 1/2j 预处理出来即可。
  • 特别的,当 i = j i=j i=j 时,即最大值与最小值相等时贡献为1。
  • 我们需要对上面进行优化,这种情况的优化思路大多是枚举其中一个,快速查询另一个。参考了出题人题解,条件是异或,所以考虑 01 T r i e 01Trie 01Trie 树。这样我们就可以从小到大枚举所有的 m a x ( a b i ) max(a_{b_i}) max(abi) 将小于 m a x max max 的前面已经计算过的加到 01 T r i e 01Trie 01Trie 树里,通过 O ( log ⁡ n ) O(\log{n}) O(logn) 的时间复杂度查询所有的 m i n min min
  • 总的时间复杂度为 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)

python ac code

代码查看 (nowcoder.com)

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FarawayTraveler_Yuch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值