Klook客路2025产研实习生招聘笔试

#客路2025全球产研实习生招聘# 纯英文的,感觉自己在面特斯拉,英伟达。
图片是我不认识的,DNS是我不懂报文内容。

手撕一:数论(没做出来)

给定n,
三个数a < b < c < n
a*b, a*c, b*c 都是完全平方数,一共有多少组合

n是2e5

手撕二:深搜

n行m列数,每行都可以翻转,要求最后每一列都没有相同的数。
是否可以实现,如果可以,是翻转哪些行。

#牛客创作赏金赛##笔试#
全部评论
笔试完多久有消息啊?
1 回复 分享
发布于 2025-03-31 20:09 辽宁
请问面了吗,佬感觉咋样?
点赞 回复 分享
发布于 2025-04-14 14:23 湖北

相关推荐

气笑了,写了半个小时感觉没GPT讲的好,喂给GPT帮我重写了一下,但是有些缩写没说明LCS&nbsp;=&nbsp;Longest&nbsp;Common&nbsp;Subsequence,最长公共子序列LIS&nbsp;=&nbsp;Longest&nbsp;Increasing&nbsp;Subsequence,最长上升子序列BIT&nbsp;=&nbsp;Binary&nbsp;Indexed&nbsp;Tree,树状数组suf[i]&nbsp;=&nbsp;suffix&nbsp;的缩写,这里表示“从&nbsp;i&nbsp;开始的最优长度”给你两个长度为&nbsp;2e5&nbsp;的排列&nbsp;p&nbsp;和&nbsp;q,求它们的最长公共子序列中字典序最大的一个。例如:104&nbsp;7&nbsp;8&nbsp;9&nbsp;5&nbsp;10&nbsp;2&nbsp;1&nbsp;3&nbsp;63&nbsp;2&nbsp;6&nbsp;10&nbsp;8&nbsp;9&nbsp;1&nbsp;4&nbsp;5&nbsp;7ans:&nbsp;8&nbsp;9&nbsp;5补了半天,也是补出来了。整体思路其实分两步:第一步,先把&nbsp;LCS&nbsp;转化成&nbsp;LIS。因为&nbsp;p&nbsp;和&nbsp;q&nbsp;都是排列,所以每个数在&nbsp;q&nbsp;中出现的位置唯一。把&nbsp;p&nbsp;中每个数替换成它在&nbsp;q&nbsp;里的下标,原问题就转化成了求最长上升子序列。第二步,为了方便构造字典序最大的答案,记录每个位置的&nbsp;suf[i]。suf[i]&nbsp;的意思是:如果当前选了第&nbsp;i&nbsp;个位置,并且把它作为这一段的开头,那么从这里开始最多还能选出多长的合法序列。注意,这个长度是包含当前位置自己的。然后贪心构造答案。从最大的&nbsp;suf&nbsp;开始往下做,每次都在当前这一层里选能选到的最大值。这里“能选到”不只是原排列里位置要在后面,还要求它映射到&nbsp;q&nbsp;里的位置也在后面。这两个条件都满足,才能保证它仍然是公共子序列。时间复杂度分析:映射下标&nbsp;O(n)。算&nbsp;suf[i],本质上还是&nbsp;LIS&nbsp;的&nbsp;DP,可以用二分&nbsp;/&nbsp;树状数组&nbsp;BIT&nbsp;加速到&nbsp;O(nlogn)。构造时,把&nbsp;suf&nbsp;相同的位置放到同一个桶里,同时记录它们的原值和原下标。每个桶内按值从大到小排序,然后从大到小枚举&nbsp;suf,顺着扫一遍找第一个合法位置即可。这样排序总复杂度是&nbsp;O(nlogn),最后构造整体扫一遍是&nbsp;O(n)。所以总复杂度是&nbsp;O(nlogn),2e5&nbsp;可以通过。下面说一下为什么能转成&nbsp;LIS。最长公共子序列这题,如果两个序列都是排列,那么把其中一个排列里的元素,替换成它在另一个排列中的下标,就可以转成&nbsp;LIS。核心原因是:“值相同且顺序一致”等价于“映射后的下标严格递增”。这一步成立的关键条件就是:排列里的每个数只出现一次。比如在&nbsp;p&nbsp;中选出一个公共子序列:p[i],&nbsp;p[j],&nbsp;p[k]如果它在&nbsp;q&nbsp;中也按同样顺序出现,那么它们在&nbsp;q&nbsp;里的位置一定满足:pos[p[i]]&nbsp;&lt;&nbsp;pos[p[j]]&nbsp;&lt;&nbsp;pos[p[k]]所以公共子序列就对应着一个上升子序列,LCS&nbsp;也就变成了&nbsp;LIS。最后说一下&nbsp;BIT&nbsp;为什么能算&nbsp;suf。这个本质上还是&nbsp;LIS&nbsp;的&nbsp;DP。如果从右往左扫,设&nbsp;suf[i]&nbsp;表示以&nbsp;i&nbsp;位置开头时最多能选多少个,那么转移就是:suf[i]&nbsp;=&nbsp;1&nbsp;+&nbsp;max(suf[j]),其中&nbsp;j&nbsp;&gt;&nbsp;i&nbsp;且&nbsp;p[j]&nbsp;&gt;&nbsp;p[i]也就是:要从右边、并且值比当前大的位置里,找一个最优的接在后面。这个可以用&nbsp;BIT&nbsp;维护前缀&nbsp;max&nbsp;来加速。因为&nbsp;BIT&nbsp;的结构天然适合维护前缀信息,后面的块会汇总前面的信息,而前面的不会被后面的影响。只要维护的是&nbsp;max&nbsp;这种可合并的信息,就能像维护前缀和一样维护前缀最大值。而这里值域又正好是&nbsp;1..n&nbsp;的排列,所以非常适合直接用&nbsp;BIT&nbsp;做到&nbsp;O(nlogn)。
查看5道真题和解析
点赞 评论 收藏
分享
评论
6
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务