前言
t
a
g
:
tag :
tag:限制交换
数学分析
排序
*1200
逆向思维
传送门 :
题意 :
给定你一个数组和一个限制
x
x
x,询问是否可以通过有限次操作使得数组变为非降序
操作 :
选择任意两个下标
i
,
j
i,j
i,j当且仅当
∣
i
−
j
∣
>
=
x
|i-j|>=x
∣i−j∣>=x的时候才可以进行交换
思路 :
本题还可以使用数学归纳法进行证明分析,奈何数学不好
我们对原数组进行一次复制,然后将复制数组进行排序
显然排序后的数组 和 原数组 不相同的地方都是需要进行交换的
我们可以反过来进行思考,考虑不能交换的位置, 即 i + x > n ∣ ∣ i − x < 1 i+x>n||i-x<1 i+x>n∣∣i−x<1的位置
显然这些位置都是固定的,如果这些位置上面数和排序数组不匹配,那么显然是不可行的
否则就是可行的
code :
int n,x;
int a[N],b[N];
int idx,change[N];
void solve(){
idx = 0;
cin>>n>>x;
for(int i = 1;i<=n; i++ ){
cin>>a[i];
b[i] = a[i];
}
sort(b+1,b+1+n);
for(int i = 1;i<=n;i++){
if(i+x > n && i - x < 1)change[++idx] = i;
}
for(int i = 1;i<=idx; i ++ ){
if(a[change[i]]!=b[change[i]]){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}