二月 CF 的解题报告

就写我打了的。

并不是官方题解的翻译,是我做的方法。

部分题目没写好。

Codeforces Round #699 (Div. 2)

A. Space Navigation

判断起点到终点的方向,保留有需要的方向再判断。

B. New Colony

暴力。如果有一个进入垃圾桶,后面的肯定都进入垃圾桶。

C. Fence Painting

除了最后一个工匠以外,前面的工匠的作品都可以选择被覆盖掉。找到所有需要变化的颜色,模拟即可。

D. AB Graph

构造题

E. Sorting Books

先留着。

Codeforces Round #700 (Div. 1)

A. Searching Local Minimum

考虑三分每次可以把序列长度 \(\times \dfrac{2}{3}\)。注意边界的特判,容易 FST。

B1. Painting the Array I

过是过了,但是我的方法似乎很垃圾,所以先留着。

B2. Painting the Array II

先留着。

Codeforces Round #701 (Div. 2)

A. Add and Divide

肯定先加后除。\(b=1\) 就加到 \(2\)。枚举 \(b\) 的值就可以了,注意到 \(b\) 不应该很大。

B. Replace and Keep Sorted

先暴力写出式子,发现很多项可以消去。最后式子中只剩下首项末项。

C. Floor and Mod

注意到只要满足 \(a=xb+x\)\(x<b\) 即可。对于一个 \(b\) 找到能对应多少个 \(a\)。列出式子发现式子中带有一个 \(\min\),分类讨论 \(\min\) 的取值条件。发现前半部分可以直接计算,后半部分整除分块。

D. Multiples and Power Differences

黑白染色后,黑格子 \(720720\),白格子 \(720720-x^4\)

E. Move and Swap

题目都没看。

Educational Codeforces Round 104 (Rated for Div. 2)

A. Arena

除了最垃圾的其他都可以。

B. Cat Cycle

???为什么我的做法这么麻烦?做了 40 min 大草。

C. Minimum Ties

奇偶分类讨论。发现偶数可以做到不平局,每个人赢一半输一半。奇数的话每个人平一局,剩下的一半赢一半输。证明不会。

考虑构造,平局的话 \(1\)\(2\) 平, \(3\)\(4\) 平,其他类似,这样构造就好了。输赢的构造可以分奇偶。

D. Pythagorean Triples

\[b+c=a^2=c^2-b^2=(b+c)\times (c-b) \]

所以只要 \(b\)\(c\) 的差为 \(1\) 的勾股数就能满足。然后可以二分或者直接算。

E. Cheap Dinner

\(3\) 次 DP。显然 \(3\) 次是互不干扰的。每次的时候就是扔掉有关系的,在剩下的里找最小值。然后考虑用一个数据结构维护就行了。我翻了很多人的记录,似乎就我是用线段树的。

F. Ones

我只知道贪心是错的。

G. String Counting

似乎是个字符串 DP。

Codeforces Round #702 (Div. 3)

A. Dense Array

在两个不满足条件的相邻的数之间插入若干个就好了。

B. Balanced Remainders

考虑每个数对 \(3\) 取模的值。分别找到 \(0\)\(1\)\(2\) 的个数,把大于平均数的转化。

C. Sum of Cubes

用 map 记录哪些数是三次方数。暴力枚举 \(a\) ,求出 \(x-a^3\) 观察其是否是三次方数。

D. Permutation Transformation

递归模拟。

E. Accidental Victory

按照能力值排序,求前缀和。观察每个人能否打过他前面所有人加起来的和。从后往前找到第一个不满足这个条件的人,那么后面所有人都是可行的。最后不要忘记按 \(id\) 输出。

F. Equalize the Array

计算出每个数出现的次数。枚举最后的次数 \(x\),把次数小于 \(x\) 的全部删掉,大于 \(x\) 的删掉使得他保留为 \(x\)。似乎需要前缀和。

G. Old Floppy Drive

如果转一圈后加的值是个负数,那就只能转一圈不到。如果不行的话直接 \(-1\)

如果转一圈后加的值是个正数,那一定是可行的。计算出要转几圈,然后可以二分一下。

Codeforces Round #703 (Div. 2)

A. Shifting Stacks

对于第 \(i\) 个位置,如果前面所有积木堆在一起能堆到 \(i-1\) 个就是可行的。

B. Eastern Exhibition

根据初一数学容易发现将 \(x,y\) 分开后,\(x_{ans}\)
应该取 \(x\) 的中位数。如果有两个中位数那么取在它们之间都可以。

C1. Guessing the Greatest (easy version)

考虑答案在区间 \([l,r]\) 中,那么我们先查询 \([l,r]\) 的次小值,再查 \([l,mid]\)\([mid+1,r]\)。哪个区间的次小值还是原区间的次小值,那么答案就在哪个区间内。容易发现大概是 \(2\times log_2^n\) 次。

C2. Guessing the Greatest (hard version)

考虑优化 C1 的算法。我们考虑先取出这个序列的次小值位置 \(u\)。考虑答案在区间 \([l,r]\) 中,我们扔掉“先查询 \([l,r]\) 的次小值”这个操作,利用 \(u\)。如果 \(u\) 在此区间中,查询 \([l,mid]\)\([mid+1,r]\) 使得这个查询区间包含 \(u\);否则如果 \(u\)\(l\) 左边,查询 \([u,mid]\) 即可,在 \(r\) 右边也同理。这样我们发现用一次操作就可以把区间缩小一半。

D. Max Median

二分答案 \(x\),判断 \(≥x\) 的解是否可行。把大于等于 \(x\) 的数替换成 \(1\),其他数替换成 \(-1\)。那么一段中位数至少是 \(x\) 转换为了这段的和是正的。所以查找新序列中有没有一个长度至少是 \(k\) 的子串满足和为正即可。这个问题可以使用前缀和,维护前缀和的前缀最小值,在线性时间内完成。所以总复杂度是 \(O(n\log n)\) 的。

E. Paired Payment

建图套路题。考虑以下建图方式:

  1. 对于一个点 \(u\) 以及一条连接 \(u\) 的边 \((u,v,w)\),建立虚点 \((u,w)\)
  2. 对于一条边 \((u,v,w)\),我们建权值为 \(0\) 的边 \(u\to (v,w)\)
  3. 对于一条边 \((u,v,w)\) 和一个虚点 \((u,x)\),建立权值为 \((x+w)^2\) 的边 \((u,x)\to v\)

怎么理解这个建图方式呢?我们考虑任意一条形如 \(x\to y\to z\) 的路径(我们把 \(y\) 叫做中转点) \(w_1\)\(y \to z\) 权值 \(w_2\)。根据操作 2,\(x\)\((y,w_1)\) 建立了权值为 \(0\) 的边。又根据操作 3,\((y,w_1)\)\(z\) 建立了权值为 \((w_1+w_2)^2\) 的边。这样就可以实现了。可以理解为中转点 \(y\) 本身是不经过的,经过的是建立在 \(y\) 上的虚点。其实也不难理解,个人感觉有点类似分层图最短路的思想。

接下来用 dijkstra 跑最短路即可。考虑这个建图方式的复杂度正确性:

  • 操作 1 中虚点个数是 \(O(m)\)
  • 操作 2 中边个数是 \(O(m)\)
  • 操作 3 中边个数是 \(O(m\times \max W)\)。因为如果某个顶点的度数为 \(t\),我们将创建不超过 \(t \max W\)的边,并且所有 \(t\) 的总和为 \(2\times m\)
posted @ 2021-02-19 15:57  Little09  阅读(256)  评论(4编辑  收藏  举报