首页 > 其他 > 详细

Codeforces Round #697(Div.3) 题解

时间:2021-02-16 23:21:40      阅读:24      评论:0      收藏:0      [点我收藏+]

今天CF又有Div3要打,菜鸡specialist想上expert/kk

就温习了一下上场Div3(原来Div3这么简单)

A.Odd Divisor (900)

题意:\(t\) 次询问,每次给出一个 \(n\),判断 \(n\) 是否有大于 \(1\) 的奇因数

数据范围:\(1<=t<=10^4,2<=n<=10^{14}\)

分析:如果没有大于 \(1\) 的奇因数,那么 \(n\) 一定是 \(2^x\),判断 \(lowbit(n)\) 是否等于 \(n\) 即可

单次时间复杂度:\(O(1)\)

B.New Year‘s Number (900)

题意:\(t\) 次询问,每次给定一个 \(n\),判断 \(n\) 是否能由若干个 \(2020\) 和若干个 \(2021\) 相加得到。可以只使用 \(2020\) 或者 \(2021\),但不能都不使用。

数据范围:\(1<=t<=10^4,2<=n<=10^6\)

分析:考虑DP预处理所有答案。设 \(f(i)\) 代表 \(i\) 能否表示出,显然 \(f(2020)=f(2021)=1\),然后枚举 \(i\)\(2022\)\(10^6\),有转移方程 \(f(i)=f(i-2020)\,or\,f(i-2021)\)

时间复杂度:\(O(10^6+t)\)

C. Ball in Berland (1400)

题意:\(t\) 次询问,每次给定 \(a\) 个男生和 \(b\) 个女生,在给出 \(k\) 组关系,每组关系指定一个男生和一个女生(保证不会重复指定两个相同的人),这两个人可以成为舞伴。求选出两对舞伴的方案数,注意一个人不能同时被选两次。

数据范围:\(1<=t<=10^4,1<=a,b,k,<=2\,\times\,10^5\),所有询问的 \(a,b,k\) 的总和不超过 \(2\,\times\,10^5\)

分析:题目即为给定一张二分图,选出两条边(顺序随意)且两条边没有公共点的方案数。设第 \(i\) 个男生连了 \(f(i)\) 个女生,第 \(i\) 个女生连了 \(g(i)\) 个男生,暴力枚举第一条边 \(l\),假设 \(l\) 的两端点分别是男生 \(x\) 和女生 \(y\),则对答案的贡献为 \(k-(f(x)-1)-(g(y)-1)-1\)。最后因为无序,除以2即可。

单次时间复杂度:\(O(k)\)

D.Cleaning the Phone (1800)

题意:\(t\) 次询问,每组询问给定 \(n\) 个元素,第 \(i\) 个元素的代价为 \(b_i\),价值为 \(a_i\),求最少代价使得选择的元素价值总和大于等于给定的 \(m\),若做不到,输出 \(-1\)

数据范围:\(1<=t<=10^4,1<=n<=2\,\times\, 10^5,1<=m<=10^9,1<=a_i<=10^9,1<=b_i<=2\),所有询问的 \(n\) 总和不超过 \(2\,\times\,10^5\)

分析:个人觉得本场最难的一道题。\(1<=b<=2\) 那么显然讲所有元素分为两类:\(b=1\)\(b=2\),将这两类元素再按照价值降序排序。然后枚举选择的 \(b=1\) 的元素的数量,二分求出此时需要选择的 \(b=2\) 的元素的数量即可。

单次时间复杂度:\(O(n \log_2 n)\)

E.Advertising Agency (1600)

题意:\(t\) 次询问,每组询问给出 \(n\) 个数,求在 \(n\) 个数里选 \(k\) 个,同时和最大的方案数,对 \(10^9+7\) 取模

数据范围:\(1<=t<=1000,1<=k<=n<=1000,1<=a_i<=n\),所有询问的 \(n\) 的总和不超过 \(1000\)

分析:先思考最大和,显然是对 \(a\) 降序排序后前 \(k\) 个的和,设 \(a\) 中有 \(x\)\(a_k\)\(a\) 的前 \(k\) 个元素中有 \(y\)\(a_k\),答案显然为 \(C_x^y\),因为 \(n<=1000\),所以 \(O(n^2)\) 预处理组合数即可。

单次时间复杂度:\(O(n \log_2 n)\)

F.Unusual Matrix (1900)

题意:\(t\) 次询问,每次给定两个边长为 \(n\) 的方阵 \(A\)\(B\),保证方阵的每个元素都是 \(0/1\),你可以进行任意次操作:将 \(a\) 的某一行/列 的数字全部反转(\(0\) 变成 \(1\),\(1\) 变成 \(0\)),判断 \(A\) 能否通过这些操作变成 \(B\)

数据范围:\(1<=t<=1000,1<=n<=1000\),所有询问的 \(n\) 的总和不超过 \(1000\)

分析:注意到某一行/列转两次没有意义,考虑枚举第一行是转了还是没转,当第一行不能动以后,如果第一行某个元素和 \(B\) 中对应位置不相同说明需要反转这一列,这样我们就确定了每一列是否需要反转,然后枚举第 \(2\)\(n\) 行,看反转/不反转后是否这一行和 \(B\) 完全相同即可。这题的套路其实非常经典(以前就做过同类题)

单次时间复杂度:\(O(n^2)\)

G.Strange Beauty (1900)

题意:\(t\) 次询问,每次给定一个长度为 \(n\) 的序列 \(a\),求删除最少的数,使得剩下的序列中,任取两个 \(a_i,a_j\),都满足 \(a_i\) 整除 \(a_j\) 或者 \(a_j\) 整除 \(a_i\),求这个最少删除数

数据范围:\(1<=t<=10,1<=a_i,n<=2\,\times\,10^5\)

分析:注意到 \(a_i\) 小那肯定有猫腻。用一个桶 \(T(x)\) 维护 \(x\) 出现的次数。考虑DP,设 \(f(x)\) 代表以元素 \(x\) 作为结尾,需要删除的最少数量(注意如果 \(T(x)=0\) 我们不予考虑),使用刷表的形式转移,调和级数暴力枚举倍数(因为将序列升序排序后第 \(i+1\) 项要么和第 \(i\) 项相等,要么是第 \(i\) 项的倍数),若 \(i\mid\j\),那么 \(f(j)=max\{f(j),f(i)+t(j)\}\),完事。

单次时间复杂度:\(O(10^5 log_2 10^5)\)

Done. 祝今晚Div3 RP++(话说昨天Edu我七切五还没更新rating /kk)

Codeforces Round #697(Div.3) 题解

原文:https://www.cnblogs.com/Cry-For-theMoon/p/14407431.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!