今天CF又有Div3要打,菜鸡specialist想上expert/kk
就温习了一下上场Div3(原来Div3这么简单)
题意:\(t\) 次询问,每次给出一个 \(n\),判断 \(n\) 是否有大于 \(1\) 的奇因数
数据范围:\(1<=t<=10^4,2<=n<=10^{14}\)
分析:如果没有大于 \(1\) 的奇因数,那么 \(n\) 一定是 \(2^x\),判断 \(lowbit(n)\) 是否等于 \(n\) 即可
单次时间复杂度:\(O(1)\)
题意:\(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)\)
题意:\(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)\)
题意:\(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)\)
题意:\(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)\)
题意:\(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)\)
题意:\(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