传送门
A A-characteristic
题意就是让我们构造一个序列,是的满足i<j的条件下a[i]*a[j]的值为1的个数满足题目要求,我们其实只用关心1和-1的个数即可,通过个数来计算出有多少对1和-1满足题意,满足题意输出YES结果return即可,如果到最后都不能,就输出NO
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010;
int n, k;
int a[N];
void solve() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
if (i * (i - 1) / 2 + (n - i) * (n - i - 1) / 2 == k) {
cout << "YES" << endl;
for (int j = 1; j <= i; j++)cout << 1 << ' ';
for (int j = i + 1; j <= n; j++)cout << -1 << ' ';
cout << endl;
return;
}
}
cout << "NO" << endl;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int h_h;
cin >> h_h;
//h_h = 1;
while (h_h--)solve();
return 0;
}
B Sort with Step
已经知道怎么做了,但是没有很好的实现出来,抽象出来就是同余类的问题,看看每个同余类里有没有全部包含,没有的话就cnt++,遍历一遍后,判断,如果cnt==0就说明灭个同余类都全部包含,题目之间可以相互交换变成有序的,如果cnt==2,说明有两个需要交换一次这两个数过后就可以实现cnt==0的操作,如果cnt>2说明通过一次操作不行。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010;
int n, k;
int a[N];
void solve() {
cin >> n >> k;
int cnt = 0;
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= k; i++) {
int x = i % k;
for (int j = i; j <= n; j += k) {
if (x != a[j] % k)cnt++;
}
}
//cout << cnt << endl;
if (cnt == 0)puts("0");
else if (cnt == 2)puts("1");
else puts("-1");
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int h_h;
cin >> h_h;
//h_h = 1;
while (h_h--)solve();
return 0;
}