模拟赛8.12 解题报告
T1. 打工(P2949 [USACO09OPEN]Work Scheduling G)
题意:有 \(n\) 个工作,\(T\) 个单位时间。每个单位时间可以完成一项工作,第 \(i\) 项工作完成可以获得 \(a_i\) 元,但只能在第 \(1...b_i\) 单位时间完成,求最大收益。\(1\le n\le 2\times10^6,\space b_i\le T\le10^9\)
经典模拟考模板题。
工作从小到大按截止时间排序,然后逐一加入优先队列。当工作数量与截止时间冲突时,检查优先队列中最小收益是否小于当前工作的收益,如果是就替换。
这也算是反悔贪心的入门题。
T2. 购物(P2851 [USACO06DEC]The Fewest Coins G)
题意:有 \(n\) 种货币,每种值 \(v_i\) 元。你现有第 \(i\) 种货币 \(c_i\) 张,想买一件价值 \(m\) 元的物品,收银员可找零钱。求你使用的货币张数与收银员找回的货币张数之和的最小值,收银员每种货币有无数张。\(1\le n,v_i\le 200,\space 1\le c_i\le20000,\space 1\le m\le10^5\)
设 \(f_i\) 表示收银员凑出 \(i\) 元需要的最少货币张数,\(g_i\) 表示己方凑出 \(i\) 元需要的最少货币张数。
答案即为
此时 \(i\) 的范围为正无穷,无法做到。注意到 \(i\) 一定不需要很大,尝试确定 \(i\) 的范围:\(0\le i\le \max\limits_{j=1}^n\{v_i^2\}\)。
感性理解,\(a\) 张货币 \(i\) 转成 \(b\) 张货币 \(j\),那么 \(av_i\le v_iv_j\)。
所以在货币转换中,范围为值域的平方级别,猜测可得,具体证明截张图吧
T3. 魔法(P5522 [yLOI2019]棠梨煎雪)
题意:\(m\) 个长度为 \(n\) 的字符串,字符有 \(\{0,1,?\}\) 三种,其中 \(\text{?}\) 为通配符。\(q\) 次操作,每次操作二选一:
-
询问有多少个 \(01\) 串可以被第 \(l\) 到 \(r\) 个字符串中的每个字符串解释
-
修改第 \(i\) 个字符串
\(1\le n\le30,\space 1\le m\le 10^5+7,\space 1\le q\le 10^6+7\)
有一个很容易的 \(O(nq\log m)\) 的做法,对于一个询问,枚举每一位,统计字符串 \([l,r]\) 在这一位是否有 \(0/1\),然后计算,可以用树状数组维护。
当然,全部都是 \(?\) 一定会 \(\text{TLE}\)。我们用树状数组,不是统计有多少个 \(0/1\),只是判断是否有 \(0/1\),性价比过低,没有很好德利用数据结构。
由于 \(n\) 很小,考虑把一个字符串 \(0/1\) 的位置状压,放进一个线段树里,每次对于 \([l,r]\) 可以求 \([l,r]\) 的二进制状态的按位或的结果。
时间复杂度 \(O(q(n+\log m))\)。
T4. 和平
题意:一棵 \(n\) 个点的树,找 \(m\) 条边数不超过 \(k\) 的路径,路径是无向的,可以相同,可以只是一个点。求不存在被所有路径覆盖的点的选 \(m\) 条路径的方案数。
分数据:
-
\(1\le n\le10^3,\space 1\le k\le n,\space 1\le m\le 10^9\)
-
\(1\le n\le10^6,\space k=0,\space 1\le m\le10^3\)
-
\(1\le n\le10^6,\space k=n-1,\space 1\le m\le 10^3\)
-
\(1\le n\le10^6,\space 1\le k\le n,\space 1\le m\le10^3\),树是一条链
先考虑 \(O(n^2)\)。
不难想到容斥,根据经典容斥,钦定被 \(m\) 条路径覆盖的点集 \(S\),方案数为 \(f(S)\),那么答案为 \(\sum\limits_S (-1)^{|S|}f(S)\)。
这是一个很特殊的点集,\(f(S)>0\) 的必要条件是这些点在一条路径上,因此我们只考虑在一条路径上的点。
如果确定了路径上钦定的最左边的点和最右边的点,设他们之间(不包括他们)有 \(p\) 个点,那么我们有 \(2^p\) 种钦定方案。更重要的是,设 \(S\) 为某一种钦定方式的点集,所有的 \(f(S)\) 都相同。
由于 \(C(p,1)+C(p,3)+C(p,5)+...=C(p,0)+C(p,2)+C(p,4)+...\),即钦定奇数个点的方案数等于钦定偶数个点的方案数,而所有的 \(f(S)\) 都相同,显然钦定奇数个点的 \(f(S)\) 与钦定偶数个点的 \(f(S)\) 抵消了,无需贡献。
因此我们只需要考虑特殊情况,即 \(S\) 只有一条边上两个点或 \(S\) 只有一个点的情况。设所有的方案数为 \(\text{All}\),钦定一个点被 \(m\) 条路径都覆盖的方案数为 \(\text{A}\),钦定一条边被 \(m\) 条路径都覆盖的方案数为 \(\text{B}\),答案为
于是直接 \(O(n^2)\) 暴力即可。
考虑其他数据点:
- \(k=0\)
\(\text{All}=n^m,\space \text{A}=n,\space \text{B}=0\),答案为 \(n^m-n\)。
- \(k=n-1\)
选择的路径没有长度限制,我们只需求一个点/一条边被多少条树上路径覆盖即可。
- 树是一条链
此时是一个序列,问题变成一个位置/相邻两个位置被多少个长度 \(\le k+1\) 的区间覆盖,也很好做。