CF1863B Split Sort

思路

对于每次操作,会把序列分成两个部分,两部分之间不会排序。

考虑仅每次排一个数字,理由如下:

假设已经排好了 1,2,3i1 的顺序,对于数字 i,如果 i+1 在该数字的前面,那么 k 应选择为 i+1,这样才能排好 ii+1。如果选择的 k 大于 k+1 那么还是需要再排一次使 ii+1 的顺序正确,操作数不变,只是操作顺序不同。

所以我们可以枚举 i,如果 i+1 在前面,则需要排序,如果在后面,则不需要排序,记录排序次数就好。

因为需要快速知道两个数的位置关系,可以提前存下来。

AC code

#include <bits/stdc++.h>
using namespace std;
int T,n,a,ans;
map<int,int>m;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n),ans=0;
for(int i=1;i<=n;++i) scanf("%d",&a),m[a]=i;
for(int i=1;i<n;++i) if(m[i+1]<m[i]) ++ans;
printf("%d\n",ans);
}
return 0;
}
posted @   One_JuRuo  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示