二月 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

考虑三分每次可以把序列长度 ×23。注意边界的特判,容易 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+xx<b 即可。对于一个 b 找到能对应多少个 a。列出式子发现式子中带有一个 min,分类讨论 min 的取值条件。发现前半部分可以直接计算,后半部分整除分块。

D. Multiples and Power Differences

黑白染色后,黑格子 720720,白格子 720720x4

E. Move and Swap

题目都没看。

Educational Codeforces Round 104 (Rated for Div. 2)

A. Arena

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

B. Cat Cycle

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

C. Minimum Ties

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

考虑构造,平局的话 12 平, 34 平,其他类似,这样构造就好了。输赢的构造可以分奇偶。

D. Pythagorean Triples

b+c=a2=c2b2=(b+c)×(cb)

所以只要 bc 的差为 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 取模的值。分别找到 012 的个数,把大于平均数的转化。

C. Sum of Cubes

用 map 记录哪些数是三次方数。暴力枚举 a ,求出 xa3 观察其是否是三次方数。

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 个位置,如果前面所有积木堆在一起能堆到 i1 个就是可行的。

B. Eastern Exhibition

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

C1. Guessing the Greatest (easy version)

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

C2. Guessing the Greatest (hard version)

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

D. Max Median

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

E. Paired Payment

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

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

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

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

  • 操作 1 中虚点个数是 O(m)
  • 操作 2 中边个数是 O(m)
  • 操作 3 中边个数是 O(m×maxW)。因为如果某个顶点的度数为 t,我们将创建不超过 tmaxW的边,并且所有 t 的总和为 2×m
posted @   Little09  阅读(260)  评论(4编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示