【典】一个计数小技巧

其实是一个比较常用的数数技巧,但是遇到题目的时候总是忘掉。

就是形如已知一个序列,求有多少个排列满足一个条件,这个条件一般是制约相邻两个元素的。

那么可以采用一个技巧就是序列排序,然后按照某种顺序插入。


ABC267G *2561

有一个长度为 n 的序列 a,求有多少种排列方式满足恰好 k1i<n,满足 ai<ai+1
n5000

考虑有多少排列问题,那么可以先对 a 排序然后依次插入。

每次插入一个最大值,那么只需要求有多少个位置满足插入后满足条件的位置 +1,然后直接跑一遍简单的背包即可。

code


ARC148E *2785

有一个长度为 n 的序列,求有多少个不同的排列满足所有 1i<n 满足 ai+ai+1k

n2×105

考虑先排序,如果从小到大,会发现很难搞,因为满足条件位置数量一直在变化。

考虑从小到大加入一个数前,先把与他满足条件的点都加入,那么可以发现可以插入的位置数就是固定的了。

具体而言,维护区间 [l,r],不断向中间移动,那么可以发现如果 l,r 满足就把 r 放入,否则放入 l,考虑这样对于 [r+1,n],这些数的旁边都可以放,而对于 [1,l1] 就都不行,因此可以直接算了。

code

posted @   houzhiyuan  阅读(282)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示
主题色彩