题目描述
为了在某谷上挑战 Chen,不知何时燃起了雄心壮志的 Jimmy 在某谷上准备好了 N 道题目,打算组建一次正式的比赛,从而把 Chen 难倒。可是,他却在组建比赛时遇到了技术难题。
为了更好地照顾不同层次的参赛者,Jimmy 所出的每道题目都有各自的难度,具体来说,第 i 道题目的难度为 Di。Jimmy 把题目按顺序添加上去后,发现他忘了考虑每道题的难度——Jimmy 当然是希望简单题在前、难题在后的,也就是题目应该按难度从小到大排序,因此他需要调整一下题目的顺序。可是某谷的系统刚好出了问题,只允许他每次对两道位置间隔为 K 的题目交换位置,例如第 1 题和第 K+1 题、第 2 题和第 K+2 题,依次类推。
Jimmy 可不想把辛辛苦苦加好的题目删掉。请你告诉他,经过次数不限的交换位置后(当然也可以不做交换),题目难度能否做到从小到大排好序。
输入
本题有多组数据。
第一行一个正整数 T,表示数组的组数。接下来一共有 2×T 行,为每组数据的具体内容。
每组数据的第一行,为两个正整数 N,K,表示一共有 N 道问题,每次交换只能对两道位置间隔为 K 的问题交换位置。
每组数据的第二行,为 N 个正整数 D1,D2,⋯,DN,表示每道问题的难度。
输出
输出一共 T 行。对于每组数据,如果最终能做到题目按难度从小到大排序,输出一行 yes
,否则输出一行 no
。
样例数据
输入 #1 复制
3 5 2 3 4 1 3 4 5 3 3 4 1 3 4 7 5 1 2 3 4 5 5 10
输出 #1 复制
yes no yes
数据范围限制
对于 100% 的数据,满足 1≤T≤5,1≤N≤5000,1≤K<N,1≤Di≤109。
提示
样例中一共有三组数据:
第一组数据中 K=2,意味着 Jimmy 每次只能交换两道位置间隔为 2 的题目。Jimmy 可以先交换第 1 题和第 3 题,交换后的题目难度为 1 4 3 3 4。然后再交换第 2 题和第 4 题,交换后的题目难度为 1 3 3 4 4,刚好是从小到大排序的,因此输出一行 yes
;
第二组数据中,不存在任何操作方案,使得题目按难度从小到大排序,因此输出一行 no
;
第三组数据中,题目本来就是按照难度从小到大排序的,Jimmy 不用做任何交换操作,因此输出一行 yes
。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int t,k,n,a[5001],b;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n-k;j++)
if(a[j]>a[j+k])
swap(a[j],a[j+k]);
bool b=0;
for(int i=2;i<=n;i++)
if(a[i]<a[i-1])
{
cout<<"no\n";
b=1;
break;
}
if(b==0)
cout<<"yes\n";
}
return 0;
}