CF1896E Permutation Sorting 的题解
题目描述
给定一个有
思路
因为移动有环,所以将数组破环为链。
接着将对应点与目标点连线。
设
所以题目就转化成为了求解
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define lowbit(x) x&-x
const int N=2e6+6;
int n,a[N],s[N],l[N],r[N],x[N],ans[N];
void updata(int x){
for(int i=x;i<=n*2;i+=lowbit(i)) s[i]++;
}int sum(int x){
int ans=0;
for(int i=x;i>=1;i-=lowbit(i)) ans+=s[i];
return ans;
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
l[i]=i;
if(a[i]<i) r[i]=a[i]+n,r[i+n]=2e6;
else r[i]=a[i],r[i+n]=a[i]+n;
}//for(int i=2*n;i>=1;i--) cout<<r[i]<<" ";cout<<endl;
for(int i=n*2;i>=1;i--){
//cout<<sum(x[i])<<" ";
//cout<<r[i]<<" "<<i<<endl;
if(i<=n) ans[a[i]]=r[i]-l[i]-sum(r[i]);
//cout<<sum(r[i])<<" "<<r[i]<<endl;
updata(r[i]);
}for(int i=1;i<=n;i++) cout<<ans[i]<<" ";cout<<endl;
for(int i=1;i<=n*2;i++) a[i]=s[i]=l[i]=x[i]=ans[i]=0;
}signed main(){
int T;cin>>T;
while(T--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】