CF1730

感觉这场的题目出得很好啊,让人忍不住想记录下来!

赛时通过 ABCD,rank 76

A

把每一种数的出现次数和 c 取个 min 再求和即可。

B

l=mini{aiti},r=maxi{ai+ti},答案即 l+r2

C

直接贪心即可。具体地,最后的串肯定是不减的,所以我们只需要求出每种数字的出现次数即可。发现一个位置的数会被 +1 当且仅当存在一个小于它的数 x,使其位于最后一个 <x 的数右侧、最后一个 x 左侧;否则这个数可以不用被 +1

D (Easy 3/0)

可能写得比较混乱。

假设 s1=1234567,s2=abcdefg,我们手模一种情况,比如最终的串为 s1=4ef5g67,s2=ab1c23d,我们发现 s1[i]=sp[j]s2[ni+1]=s3p[nj+1],其中 p=1,2。进一步地,我们把 s2 反转,并考察 s1[i],s2[i],s1[ni+1],s2[ni+1],其必然由 s1,s2 两个位置上的字符构成,设为 i,j,因为它们可以匹配,所以无序对 (s1[i],s2[i])=(s1[j],s2[j]),我们把所有无序对求出来并把相同的进行匹配,可以证明答案为 YES 当且仅当全部匹配完或者最终剩下一个形如 (c,c) 的对。

E (Easy 3/4)

其实不难想,但是比赛的时候想复杂了,赛后冷静下来就会了。

有许多种 O(nlognmaxd(ω)) 的做法,但对于我这个大常数 sb 来说这个复杂度肯定过不去,我们需要寻求时间复杂度更低的做法。

从左到右枚举 i,钦定最大值为 y=ai(如果有多个,钦定最大值为最左侧的)并枚举其约数 xy=x 的情况是容易的,这里仅考虑 x<y 的情况。此时我们再枚举 xy 的左侧还是右侧,以左侧为例,我们现在来考虑什么样的 l,r 是能被这种情况计入答案的:

  • lir
  • j<i,aj=ai,j<l
  • minj=liaj=x,maxj=liaj=y
  • minj=irajx,maxj=iraj=y

右侧是类似的。

我们需要 O(1) 地回答。发现我们只需要处理每个数出现的所有位置和每个 ai 左侧 / 右侧第一个小于 / 大于它的位置即可,所以跑四遍单调栈就能解决问题。

但是其实这么做的话细节很多,在此不一一赘述了,有问题可以看看又臭又长的代码,欢迎大家关注 BraveXuZhiJieGoGoGo 这个号

时间复杂度 O(nmaxd(ω)),其中 ω=106

F (Easy 3/3)

感觉比 E 好想又好写啊!

首先把问题转化为求最少的交换相邻两数的次数,使得交换完成后对于 i<jpipj+k

发现对于一个前缀 i,其中的数肯定 i+k,并且 1ik 肯定已经全部出现了,剩下的是 ik+1i+k2k 个数,搜一下发现有 2k 种状态满足条件,这很好啊!于是直接设 fi,j 表示前 i 个数的状态第 j 种的最小交换次数即可。转移考虑填 ik 或者填 ik+1i+k 的数。

还有一个问题是初值 fk,j 的预处理。事实上因为只有 k 个数,直接枚举排列并暴力计算即可!

时间复杂度 O(n2kk2)

posted @   Scintilla06  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示