传送门

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;
}