CodeForces 比赛总结

账号 1:Eason_OIer\(\bf{now\ rating=}\color{cyan}\ \bf{1431, Pupil}\)

账号 2:Eason__cyx\(\bf{now\ rating=}\color{gray}\ \bf{772, Newbie}\)

记录 Div.1+2 / Div. 2 的题解。

Codeforces Round 997 (Div. 2)

惨败,rk7283,1647-95=1552,Expert -> Specialist。呜呜我的蓝名(


A. Shape Perimeter

大概是最近的 Div.2 中算比较困难的一道?

不太好说思路,画了个图:

那么直接算就行了。时间复杂度 \(O(n)\)提交记录

B. Find the Permutation

唐诗题,题意很史。

首先你会发现如果 \(g_{i,j}=1\),那么其实一定有 \(i < j\)。并且,假设 \(i\) 在排列中的位置是 \(id_i\),那么一定有 \(id_i < id_j\)。题意就是这个。

首先从 \(1\) 的情况入手。不难发现,\(g_{1,i}\) 中一共有几个 \(0\)\(1\) 的前面就有几个数。那么就可以确定 \(1\) 的位置。然后对于 \(2\),此时它与 \(1\) 的位置关系和与 \(3 \sim n\) 的位置关系也确定了,那么也可以确定他的位置。后面的数以此类推。

那么就可以得到整个排列了。时间复杂度 \(O(n^2)\)提交记录

C. Palindromic Subsequences

这种题都没有观察出来???赛时糖丸了,赛后立刻出做法。

考虑构造 \(1,1,2,3,4,\dots,n-2,1\)。这样,最长的回文子串长度为 \(3\)。首先第一个 \(1\) 和最后一个 \(1\) 放两边,中间随便加个数都行,这样的方案有 \(n-2\) 种;然后第二个 \(1\) 和最后一个 \(1\) 放两边,中间也可以随便加个,方案有 \(n-3\) 种,一共加起来就是 \(g(a) = n-2+n-3=2n-5>n\),可以通过。时间复杂度 \(O(n)\)提交记录

-D. Unique Median

妙妙题,参考了官方题解。

考虑一个子段 \([l,r]\) 什么时候是坏的。首先必要条件显然就是 \(r-l+1\) 是偶数。那么假设 \([l,r]\) 的中位数是 \(x\),如果这个子段是坏的,那么一定有 \(\frac{r-l+1}{2}\) 个数 \(\le x\)\(\frac{r-l+1}{2}\) 个数 \(>x\),这样就满足条件了。

接下来考虑怎么计数。因为 \(1 \le a_i \le \color{red}\bf{10}\),所以我们从这里入手。考虑枚举中位数是 \(x\) 时的答案。我们可以建立 \(b\) 数组,如果 \(a_i \le x\),那么 \(b_i=-1\);否则 \(b_i=1\)。那么只要有一个子段的和是 \(0\),就说明这个子段是坏的了。那么数一下即可。时间复杂度 \(O(nV)\)\(V\) 是值域,这里 \(V=10\)

代码还没写,咕咕咕。

CodeForces Round 999 (Div. 1+2)

又掉分了 /ll /ll /ll 赛时过了 ABD。

A. Kevin and Arithmetic

分讨。如果这个数组中没有偶数,那么第一次不能得分,后面都可以。那么答案就是 \(n-1\)

如果有偶数,假设有 \(c\) 个偶数和 \(n-c\) 个奇数,你会发现偶数除了第一个以外都是没法得分的,所以我们将其放在最前面。那么所有奇数都可以得分。那么答案就是 \(n-c+1\)

做完了。时间复杂度 \(O(n)\)提交记录

B. Kevin and Geometry

简单题。

假设等腰梯形上底为 \(a\),腰为 \(b\),下底为 \(c\),那么只要 \(a+2b > c\) 就可以组成等腰梯形。那么考虑贪心,找到最小的两个相等的边,然后排序,枚举剩下的所有的数,如果和他相邻的数和他的差小于两条腰的和,那么就可以。

时间复杂度 \(O(n \log n)\)提交记录

C. Kevin and Puzzle

赛时没有瞪出来怎么 dp()

直接设 \(dp_i\) 表示第 \(i\) 个人是诚实的,前 \(i\) 个人的方案数。然后分讨:

  • 如果第 \(i-1\) 个人是诚实的,那么有 \(a_{i-1}=a_i\),此时应该有 \(dp_i = dp_i + dp_{i-1}\)

  • 否则,因为骗子不会相邻,那么第 \(i-2\) 个人一定是诚实的,此时应该有 \(a_{i-2}+1=a_i\),有 \(dp_i = dp_i + dp_{i-2}\)

最终答案就是 \(dp_n+dp_{n-1}\)。(这是因为,第 \(n\) 个人可能是骗子)

时间复杂度 \(O(n)\)。多测记得清空。提交记录

D. Kevin and Numbers

很有趣的题。

正着维护合并不太好做,所以我们反着想,考虑如何将 \(b\) 中的数拆分为 \(a\) 里的数。

由于合并两个数 \(x\)\(y\) 需要满足 \(|x-y|\le1\),所以对于一个数 \(k\),只能由 \(\lfloor\dfrac{k}{2}\rfloor\)\(\lceil\dfrac{k}{2}\rceil\) 合并而来。又因为每次拆分会多出来 \(1\) 个元素,所以我们需要恰好拆 \(n-m\) 次。

接下来考虑怎么拆。对于 \(b\) 中当前最大的一个数,如果其已经在 \(a\) 中出现过了,那么将其与 \(a\) 中的那个数一起删掉;否则,如果可以拆分的话,这个数一定是被拆开的,那么将这个数拆开即可。这样就可以通过了。

上面过程涉及的最大值和删除操作,可以用一个优先队列维护 \(b\),一个 map 维护 \(a\),即可解决。时间复杂度大致是 \(O((n-m) \log (\log V + \log m))\)提交记录

CodeForces Round 1000 (Div. 2)

A. Minimal Coprime

笨蛋题。。。

你不难发现只有 \([x,x+1]\) 才是这个所谓的“最小互素线段”。那么对于区间 \([l,r]\),答案就是 \(r-l+1-1=r-l\)。特判特殊情况:\([1,1]\)

时间复杂度 \(O(1)\)提交记录

B. Subsequence Update

困难题。

考虑到如果你的子序列中包含了 \(i_p<l\)\(i_q>r\),那么这两个元素互换之后依然不会对答案产生贡献,所以是不优的。那么所以,产生答案只可能有两种情况:一种是子序列中的所有元素都在 \([l,n]\) 之间,另一种是子序列的所有元素都在 \([1,r]\) 之间。那么把这两个序列取出来排序取前 \(r-l+1\) 小就是答案。

时间复杂度 \(O(n \log n)\)提交记录

CodeForces Round 1001 (Div. 1+2)

A. String

不难发现每次操作都会减少一个 1。那么数一下 1 的个数就是答案。单组时间复杂度 \(O(|s|)\)

B. Clockwork

/bx /bx /bx

考虑对于一个位置 \(i\),我们肯定是需要不停地在 \(1\)\(n\) 之间所有数之间来回移动的,那么在位置 \(i\) 至少需要花费的时间是 \(2 \times \max(i-1,n-i)\)。如果所有 \(t_i\) 都大于这个值,那么一定可以满足条件。反之,肯定有一个会来不及移动。

时间复杂度 \(O(n)\)提交记录

-C. Cirno and Operations

不难发现如果先反转再差分,和先差分再反转的区别就是总和取了个反。那么任意的操作序列都可以看成先做了一些差分,然后反转,然后取一些反。那么我们可以直接枚举做了几次差分,然后取绝对值,找最大值即可。时间复杂度 \(O(n^2)\)

注意不做差分是不能取反的。

CodeForces Round 1002 (Div. 2)

只过了一题,耻辱!!!

A. Milya and Two Arrays

因为每个元素都至少有两个,所以我们只要找到两个数组中各有两个不一样的元素即可,或者如果一个数组全是一样的,另一个数组有三种以上不同的元素也行。时间复杂度 \(O(n)\)\(O(n \log n)\),取决于拿啥东西计数。提交记录

CodeForces Round 1004 (Div. 1+2)

上分啦。

A. Adjacent Digit Sums

讨论两种情况:

  • 第一种,\(x\) 的个位数 \(\not = 9\)。那么显然有 \(y=x+1\)

  • 第二种:\(x\) 的个位数 \(=9\)。那么 \(+1\) 之后个位变 \(0\),十位加一,这样就有 \(x-y=8\)。但是十位可能也是 \(9\),观察可以得到不管如何进位 \(x-y\) 一定是 \(8\) 的倍数。

这样就做完了。时间复杂度 \(O(1)\)提交记录

B. Two Large Bags

感觉就乱贪心啊。

考虑从小到大枚举当前是哪个数。然后:

  • 如果当前这个数出现的个数为偶数,那么留下两个这个数,剩下的全部变成这个数 \(x+1\)

  • 如果当前这个数出现的个数为奇数,且前面已经有某个数是奇数,那么判断这两个数之间是否所有数都可以出现,如果可以,那么这两个奇数都可以变成偶数。

如此贪心,整个过程结束后判断是否所有数的出现个数都是偶数个即可。提交记录

C. Devyatkino

不会证,啊吧啊吧。

你观察样例发现每次加的 \(7\) 的个数好像都是一样的。那么枚举一下每次操作都加几个 \(7\) 组成的数,然后取个最小值就完了。提交记录

D. Object Identification

牛的,这场 Div. 2D = Div. 1A,然后这题直接硬控 jiangly 50 分钟。/bx


首先判断这个 \(x\) 是不是一个排列;如果不是,那么假设这是一张图,那么显然这个点是不可以到达任何一个点的。所以假设在 \(x\) 中数 \(k\) 没有出现,则我们可以询问 ! k k+1(注意 \(k=n\))。因为如果是 \(n\) 个点的情况,那么这些点两两互不相同,所以距离不可能是 \(0\);我们可以根据这个判断,如果是 \(0\),那么就是第一种;否则是第二种。

那么如果 \(x\) 是排列呢?我们可以先找到 \(x_{p1}=1\)\(x_{p2}=n\)。然后我们询问 1 p1 p21 p2 p1,得到两个结果 \(\text{ans1}\)\(\text{ans2}\)。那么对于 \(n\) 个点来说,显然应当有 \(\text{ans1=ans2}\),即他们如果不相等,就一定是第一种情况。如果他们相等,说明如果是图,那么图中可能有环。但是如果有环,又由于只有 \(n\) 条边,所以两个答案最大为 \(\dfrac{n}{2}\)。但是如果是 \(n\) 个点,那么一个横坐标是 \(1\),另一个横坐标是 \(n\),距离一定 \(\ge n-1\)

那么就做完了。时间复杂度 \(O(1)\)提交记录

CodeForces Round 1005 (Div. 2)

A. Brogramming Contest

代码还没补。

首先我们在整个字符串前面补一个 0。那么每次操作就是找到最右边的形如 01 的这个位置,然后把这个 1 后面的全部挪到 \(t\) 里去即可。时间复杂度 \(O(n)\)

Educational Codeforces Round 174 (Rated for Div. 2)

没打,补题。

A. Was there an Array?

考虑什么时候无解。不难发现如果有三个连续的 \(b_i\) 形如 1 0 1 的时候,第一个应当和第二个相等,第三个也应该和第三个相等,那么,这三个都应该相等。那么第二个就应该是 \(1\),和前面矛盾。所以这种情况就无解。

时间复杂度 \(O(n)\)提交记录

B. Set of Strangers

个人觉得比 A 好想。

观察得到对于相同的数来说,至多需要两次就可以将他们全部变成另一个数。又发现 \(a_i\) 值域不大,所以考虑记 \(f_i\) 表示所有 \(i\) 如果要全部变成别的数需要几次操作,不难发现 \(0 \le f_i \le 2\)。这个可以 \(O(nm)\) 计算。那么算完之后根据贪心,选择操作次数最多的任意一个数,然后最优策略就是将所有数变成这个数。所以最终答案就是 \(ans=\sum f_i - \max f_i\)。时间复杂度 \(O(nm)\)提交记录

注意,\(700 \times 700 = 490000\),不是 \(49000\)。/oh

C. Beautiful Sequence

困难题。一个重要的性质是 \(\color{red}\bf{1 \le a_i \le 3}\)。那么考虑从这入手,设 \(f_{1/2/3}\) 表示当前考虑的这个数是 \(1/2/3\) 时的方案数。

然后?你会发现这里说的一个数前面有数比他大有点怪,仔细考虑一下。假设 \(a_x\) 前面比它小的离他最近的是 \(ap_x\)。那么不难发现 \(ap_{ap_{ap_{\dots}}} = 1\)。所以第一个数一定比后面所有数小,同理最后一个数一定比前面所有数大。又因为 \(a_i\) 的范围,所以只能 \(a_1=1,a_{\text{siz}}=3\),剩下的是 \(2\)。那么计算方案数就不难了,有转移方程:

\[f_i=f_i + f_{i-1} + [i = 2] \times f_i \]

(其实本来是 \(f_{i,1/2/3}\) 的,这里直接滚动数组了)

那么做完了。时间复杂度 \(O(n)\)提交记录

posted @ 2025-02-22 20:49  _幸运草  阅读(106)  评论(0)    收藏  举报