题目
们有一个长度为 NN的序列: A=(a_1,\ldots,a_N)A=(a1,…,aN). 另外, 还有一个整数KK.
你可以执行下列操作任意次,包括0次
- 选择一个整数 ii,1 \leq i \leq N-K1≤i≤N−K, 我们可以交换 a_iai 和a_{i+K}ai+K的值.
确定我们是否可以通过任意次操作使AA变成一个单调不递减序列.
Constraints
- 2 \leq N \leq 2 \times 10^52≤N≤2×105
- 1 \leq K \leq N-11≤K≤N−1
- 1 \leq a_i \leq 10^91≤ai≤109
- 所有的输入都是整数.
Input
输入格式:
NN KK a_1a1 \ldots… a_NaN
Output
输出格式:
如果能通过任意次操作后将 AA变为单调不递减序列, 输出Yes
;否则, 输出No
.
Sample 1
Inputcopy | Outputcopy |
---|---|
5 2 3 4 1 3 4 | Yes |
样例解释
- 选择i=1i=1 交换 a_1a1 和 a_3a3. AA 变为 (1,4,3,3,4)(1,4,3,3,4).
- 选择i=2i=2 交换 a_2a2 和 a_4a4. AA 变为 (1,3,3,4,4)(1,3,3,4,4).
Sample 2
Inputcopy | Outputcopy |
---|---|
5 3 3 4 1 3 4 | No |
Sample 3
Inputcopy | Outputcopy |
---|---|
7 5 1 2 3 4 5 5 10 | Yes |
不需要任何操作.
思路
每个数可以和i+n*k的数任意交换(n可正可负可0)所以在(i+k,i+2k.........i+nk)的数字内每个数可以任意换,所以我们把每一组这样的数全部排好序,在放到原数组里,判断是不是单调不递减的
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int a[N];
int n,k;
bool check(int a[])
{
for(int i=1;i<=n;i++)
{
if(a[i-1]>a[i]) return false;
}
return true;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=k;i++) // 枚举每一组
{
vector<int> ans;
for(int j=i;j<=n;j+=k) // 取出组内的的数
{
ans.push_back(a[j]);
}
sort(ans.begin(),ans.end()); // 排序
int p=i;
for( auto x:ans) // 再放入
{
a[p]=x;
p+=k;
}
}
if(check(a)) cout<<"Yes\n";
else cout<<"No\n";
return 0;
}