do_while_true

一言(ヒトコト)

「比赛题解」Codeforces Round #690 (Div. 3) 简要题解

A

直接倒推回去即可,左边右边依次向中间扫,依次扫到的就是原序列。

Code

用时:3min

B

看最前面能连"2020"的前面多少,最后面能连"2020"的后边多少,如果相加大于4即为答案。

Code

用时:4min

C

最优操作为从9到1依次使用。模拟即可。

Code

用时:3min

D

答案实际上是求划分成若干段,这些段的和都一一相等,且分段最多。

那么他们最后那一位的前缀和一定是个等差数列,枚举第一段的最后一位即可。

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

反思:没有一眼秒掉,而是先去想 \(\mathcal{O}(n^3)\) 的区间dp,存在一定程度上的思维定式。

Code

用时:6min

E1

枚举 \(a_i\)\((a_j,a_k)\) 只有几种可能的取值,记录每个取值有多少个数,大力分类讨论全部方案算在一起,最后总和除以\(3\)即可。

Code

反思:简单组合数学计算上存在严重的漏洞,分类讨论能力不够强,统计答案有处没有开ll用了7min才发现。

用时:36min

E2

对于一个 \(a_i\) 当最大值来说,只有值在 \([\max(0,a_i-k),a_i]\) 之间的数才会和它组成答案,算组合数统计。

开值出现次数的前缀和记录即可,为了防止重复还需要每算一遍前把前缀和中包含这个数的都减掉这个数出现的次数,但是这个修改是单调的,直接扫就可以了。

Code

用时:赛后补题

F

首先离散化一下,线段的值域变为 \([1,2n]\)

对于一条线段 \(i\) 来说,考虑它作为和全部线段有交的那个线段来更新答案。

那么统计有多少线段和它不相交即可,只有在它左边或在它右边,那么就相当于对于每个 \(i\) 查询一下有多少 \(j\) 满足 \(r_j<l_i\)\(l_j>r_i\)

两种询问分别离线下来扫一遍即可。

Code

反思:一眼秒了没敢写,复制粘贴忘改小地方WA了一次。

用时:赛后补题

posted @ 2021-01-25 22:51  do_while_true  阅读(106)  评论(0编辑  收藏  举报