CF div2 997(A~E)
赛时3题,比上一把还要手速场。虽然手速慢了一些,但好在没掉分,并重新回到蓝名了。
A
很套路的题目。第一次移动没有用,把其余方向的移动距离求和加边长,取2倍就是答案。
B
相当于告诉了你一个排列中任意一对
,代表 在 前面 ,代表 在 后面
取整个
确定每个数位置的具体做法:倒序枚举排列的每个位置,最终后面 有
C
见到过的最
想一下,题目并没要求最长回文串的长度,故可以猜想:这个最长回文串长度越短,数量可能就会越多。由于
D
中位数&子区间相关
回顾一下这个
的数映射为 的数映射为
设映射后的数组为
- 若
,则一定有 - 若
,则一定有
证明略
这样就可以解决中位数,子数组结合起来的相关问题。比如要求出中位数
同时,中位数还经常与二分结合,因为中位数一般会和单调性相关。比如这道题:CF947C
应用:确定某个子数组的中位数:直接二分中位数(
回到本题。题意就是要对一个数组统计出 偶数长子数组排序后最中间的两个数 相同的子数组的个数,这里可以将这两个数理解为两个中位数。
由于
按照上述想法,直接枚举每个中位数,并看满足
那怎么避免重复统计贡献呢?由于每个子区间的中位数是唯一的,而在枚举过程中也枚举到了所有可能的中位数。故可以这样想:在枚举某个中位数时,若统计到了某个子数组的
判断某个数是否在子区间内出现:由于值域很小,故对每个数预处理一个高维前缀和即可。
复杂度:
E
卡特兰数 + 递归
首先对于题目中“任意一对线段 互相包含 或者 互不相交” 的性质,可以想到卡特兰数中的括号序列(任意一对括号也满足互相包含或互不相交),因此可以想到卡特兰数。
现在考虑某一条线段的拆分:可以拆成两个或多个连续的线段。但显然直接拆为两条线段的情况才能对应总线段数最多的情况,因为
而每一条线段可以想象为一个结点,在该线段内拆分出的子线段对应该结点的子节点,这样形成的结构就是一个树。又由上段可知,形成的树一定是一棵二叉树,并且每个结点要么无子节点,要么有两个子节点(即广义上的满二叉树),而叶节点对应的是每一个
若
可以将每一个固定的线段想象为一个特殊的结点,该结点特殊在——其内部还可以继续做划分。这样就可以递归地处理该问题了。具体细节见代码。
复杂度:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战