CF1701-1800做题记录

资历太浅,没法给出什么高质量的内容(

鉴于这人还要备战中考,更新频率不是很高。

本博客所记录的题目最低难度是 1300。

所有代码均可在我的代码仓库中找到。

101-200

CF148E Porcelain(1900)

简单 dp,首先前缀和加贪心处理出对于货架 \(i\)\(j\) 个物品的最大价值 \(f_{i,j}\),然后就是一个分组背包的模板了。

901-1000

CF922E Birds(2200)

乍一看感觉很棘手,那么可以结合数据范围大胆考虑,设 \(f_{i,j}\) 表示在第 \(i\) 棵树下总共召唤了 \(j\) 只鸟并到达第 \(i + 1\) 棵树所剩余的最大魔法值,如果剩余的魔法值大于等于 \(0\),那么肯定是可以召唤 \(j\) 只鸟的。

转移方程:

\[f_{i,j} = \max(\min(f_{i - 1, j - k} - k * cost_i + w, w + j * b), f_{i,j}) \]

一些小细节:

  • 因为在从第 \(i\) 棵树转移到第 \(i + 1\) 棵树的过程中魔法值可能突破上限,因此我们这里的 \(f_{i,j}\) 这样设计,否则不是很好维护。初值为 \(f_{0,0} = w\),其余均设为 \(-1\) 代表无法到达。
  • 记得开 long long。

1001-1100

CF1060C Maximum Subrectangle(1600)

根据这个矩阵的性质,很容易发现如果你选择了左上角坐标为 \((x1, y1)\),右下角坐标为 \((x2, y2)\) 的矩阵,总和就是 \(\sum_{i = x1}^{x2}a_i \times \sum_{i = y1}^{y2} b_i\)

那么考虑枚举 \(x1\)\(x2\),通过维护前缀和快速确定区间和,然后便可以得出 \(b\) 数组中选取的区间和最大为 \(x\) 除以 \(a\) 数组的区间和。先对 \(b\) 数组进行预处理,得出对于确定最大区间和的情况下,最大区间长度是多少即可。

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

CF1090D Similar Arrays(1800)

简单构造,首先可以得到的一个结论是,当 \(n = 1\) 时,一定无解,因为 \(B\) 序列中至少要有两个数。然后可以得到,当 \(m = \frac{n(n-1)}{2}\) 时也一定无解,因为在这一种情况下,任意两个数都得到了比较,而 \(A\) 序列中的数两两不同,\(B\) 序列中存在一对相同的数。因此一定不满足题意。

那么除去这两种情况,保证有解。我们可以找到两个没有被比较的位置 \(i,j\),那么再 \(A\) 序列中我们可以把 \(1\)\(2\) 分别放在 \(i,j\) 上,其余随意放置,\(B\) 序列中只需要把 \(2\) 改成 \(1\) 即可,其余跟 \(A\) 序列一模一样。正确性很好证明。

1701-1800

CF1768C Elemental Decompress(1300)

显然,按照最大值从小到大排序之后会轻松很多。基本思路是这样,首先优先将第一个排列的值赋为最大值,然后选取第二个排列中能够使用的最小值。如果第一个排列中已经使用过当前位置上的最大值,就反过来执行一遍。如果一遍模拟下来不会有不合法的情况,就说明能够构造出方案,并直接输出构造的排列即可,否则输出 NO

CF1768D Lucky Permutation(1800)

一个性质是很显然的,恰好存在一个逆序对的情况当且仅当刚好存在一个 \(x\),满足 \(p_x > p_{x + 1}\),并且对于除了 \(x\)\(x + 1\) 以外的位置满足 \(1 \le i \le n\),有 \(p_i = i\)

那么接下来可以考虑怎么做,一个这样的排列显然是由 \(1,2,...,n\) 这个排列经过一次操作产生的,那么考虑如何把原排列变为一个 \(1,2,...,n\) 的排列。对于每个 \(i\),由 \(i\)\(p_i\) 连一条边,一定会形成若干个环,记环的数量为 \(cnt\),那么把原排列变为 \(1,2,...,n\) 所需的最少次数就是 \(n - cnt\)

那么如果存在一个 \(i\),使得 \(i\)\(i + 1\) 在同一个环里,答案就可以减一,反之加一。

CF1781D Many Perfect Squares(1800)

容易发现,答案至少为 \(1\),那么考虑答案如何至少为 \(2\)

枚举 \(a_i, a_j (j > i)\),设

\[\begin{cases} a_j - a_i = d \\ a_i + x = q^2 \\ a_j + x = p^2 \end{cases} \]

我们就可以得到 \(d = p^2 - q^2 = (p + q) (p - q)\)

因此 \(p - q\)\(d\) 的因子,那么我们可以暴力枚举这个 \(p - q\),并可以求出对应的 \(p\)\(q\)。确定 \(p\)\(q\) 以后我们就可以得到 \(x\) 了,对于每个 \(x\),对整个序列暴力加一遍,判断有多少个数是完全平方数,答案取所有答案中的最大值即可。

CF1788C Matching Numbers(1300)

观察样例,可以大胆猜想,如果 \(m\) 是偶数直接无解。

考虑证明:

\(\sum^{2m}_1 = \frac{2m(2m + 1)}{2} = m(2m +1)\),然后要求构造出的等差数列有 \(m\) 项且公差为 \(1\),那么设首项的值为 \(x\),那么尾项就是 \(x + m - 1\),总和就是 \(\frac{m(2x + m -1)}{2}\),那么两个式子的和要相等,得到 \(m(2m + 1) = \frac{m(2x + m - 1)}{2}\),转化一下得到 \(3m+3=2x\),当 \(m\) 等于偶数时,左右两边的奇偶性显然是不同的,因此当 \(m\) 等于偶数时无解。

那么讨论当 \(m\) 为奇数如何构造一组合法方案。通过上面的式子可以求出初项,那么考虑以 \(\lceil m / 2 \rceil\)\(m + 1\) 开始,左边持续减一,右边持续加二,这样可以保证构造出的项持续上升,当左边减到 \(1\) 时,将其重置为 \(m\),同时将右边重置为 \(m + 2\),重复这个过程,直到构造出 \(m\) 项为止。

posted @ 2023-04-18 13:09  hswfwkj  阅读(78)  评论(0)    收藏  举报