[算法训练] 牛客周赛143①质因数分解/差分/状压DP②轮廓线+并查集/动态规划+线段树+坐标压缩
541 字
3 分钟
[算法训练] 牛客周赛143①质因数分解/差分/状压DP②轮廓线+并查集/动态规划+线段树+坐标压缩
牛客周赛143-EF未补
https://ac.nowcoder.com/acm/contest/134529#question
A-模拟
题意比较乱,实际上,直接输出1,n即可
x = int(input())print(1,x)B-counter
map后计数并加上是0的即可
from collections import Countern, m, x = map(int, input().split())a = list(map(int, input().split()))cnt = Counter(a)ans = 0for v in cnt.values(): if v <= x: ans += 1ans += (m - len(cnt))print(ans)C-质因数分解
题意:
给你x和y求x*y所有正因子的d**d和
题解:
分别分解x和y,合并质因数指数,利用合并后的质因数生成所有因子,求和即可
MOD = 10 ** 9 + 7def fc(num): factors = {} d = 2 while d * d <= num: if num % d == 0: cnt = 0 while num % d == 0: num //= d cnt += 1 factors[d] = factors.get(d, 0) + cnt d += 1 if d == 2 else 2 if num > 1: factors[num] = factors.get(num, 0) + 1 return factorsdef get_factors(factors): res = [1] for p, e in factors.items(): new = [] for f in res: mul = 1 for _ in range(e + 1): new.append(f * mul) mul *= p res = new return resx, y = map(int, input().split())fac_x = fc(x)fac_y = fc(y)for p, e in fac_y.items(): fac_x[p] = fac_x.get(p, 0) + ec = get_factors(fac_x)ans = 0for d in c: ans = (ans + pow(d, d, MOD)) % MODprint(ans)D-差分
题意:
有一些区间,选择一个长度为K的区间,使得与这个区间相交的给定区间的数量最多
题解:
对于给定区间 与 相交,等价于:
即:
即:
因此,区间 能与 相交的 的范围是
每个给定区间对应一个 的可选区间 。我们要求一个点 被最多的这样的区间覆盖。
转换为一维区间最大重叠问题:给定若干区间 ,求一个点被覆盖的最大次数。
n, k = map(int, input().split())g = []for _ in range(n): l, r = map(int, input().split()) g.append((l - k, 1)) g.append((r + 1, -1))g.sort()cur = 0ans = 0for _, d in g: cur += d ans = max(ans, cur)print(ans)E:状压DP+轮廓线+并查集
F:动态规划+线段树+坐标压缩
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
[算法训练] 牛客周赛143①质因数分解/差分/状压DP②轮廓线+并查集/动态规划+线段树+坐标压缩
http://blog.7a7a68.xyz/posts/牛客周赛143-ef未补/