Codeforces 1823B Sort with Step

本文最后更新于:34 分钟前

Codeforces 1823B Sort with Step

题目大意:

给你两种操作数组的方式(1)隔k交换,可任意进行,(2)任意交换,只能进行一次。问只有一次任意交换机会和任意次交互机会能否使数组非降序排序。

解题思路:

此题用a存储原数组,b数组存储改数字当前位置,判断当前数字位置是否与这个数字应该在的位置间的差对k求余是否等于零即可判断是否需要强转。由于题目说原数组是数列,所以方法是可行的。

我之前甚至想了逆序对的做法,还是天马行空了

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
void solve(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
b[a[i]]=i;
}
int cnt=0;
for(int i=0;i<=n;i++){
int c=abs(b[i]-i);
if(c%k!=0)cnt++;
}
if(cnt==0)cout<<0;
else if(cnt<=2)cout<<1;
else cout<<-1;
}
int main(void){
int t;
cin>>t;
while(t--){
solve();
cout<<endl;
}
}
//code by lyriv;
//welcome to lyriv.com;

Codeforces 1823B Sort with Step
http://example.com/2023/11/10/Codeforces1823B_Sort with Step/
作者
Lyriv
发布于
2023年11月10日
许可协议