B. Sort with Step
题意:
给定一个长度为n的数组,任意两个数如果满足i-j的绝对值等于k则可以互相交换,若不能通过此操作实现数组排序,则需要使用次数来强制交换,次数小于等于1输出次数,否则输出-1.
分析:
最优情况下,找出需要操作的数的数量然后两两交换是次数最少的。
代码:
#include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef pair<int,int> pii; typedef long long ll; const int N=2e5+10; int a[N]; int b[N]; void solve() { int t; cin>>t; while(t--) { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i]; b[a[i]]=i; } int sum=0; for(int i=1;i<=n;i++) { int j=b[i]; if(abs(j-i)%k==0) continue; else { sum++; } } if(sum==0) cout<<0<<'\n'; else if(sum<=2) cout<<1<<'\n'; else cout<<-1<<'\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); return 0; }