提出 #40423022


ソースコード 拡げる

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>
#include <cassert>
#include <map>
#include <numeric>
#include <cstring>
#include <set>
#include <ctime>
#include <queue>
#include <cmath>
#include <iomanip>
#include <iterator>
#include <bitset>
#include <unordered_map>
#include <complex>
#include <unordered_set>
#include <chrono>
#include <random>
#include <array>
#include <functional>
#include <random>

using namespace std;

const int maxN = 109;
const bool DBG = 0;
int N, a[maxN], plusN[2][maxN], plusMinus[2][maxN];
vector<int> curr;
vector<vector<int>> ans;

void addCurr() {
    for (int i=1; i<=N; i++)
        a[i] += curr[i];
    ans.push_back(curr);
}

void addV(int v[]) {
    for (int i=1; i<=N; i++)
        curr[i] = v[i];
    addCurr();
}

void print() {
    printf("Yes\n");
    printf("%d\n", ans.size());
    for (auto v : ans) {
        for (int i=1; i<=N; i++)
            printf("%d ", v[i]);
        printf("\n");
    }
}

void init(int N) {
    plusN[0][1] = plusN[1][1] = N;
    for (int i=2; i<=N; i++)
        plusN[0][i] = i - 1,
        plusN[1][i] = N + 1 - i;
    for (int i=1; i<=N; i++)
        plusMinus[0][i] = i,
        plusMinus[1][i] = N + 1 - i;
    swap(plusMinus[0][1], plusMinus[0][2]);
}

void addN(int i) {
    for (int lin=0; lin<2; lin++) {
        swap(plusN[lin][1], plusN[lin][i]);
        addV(plusN[lin]);
        swap(plusN[lin][1], plusN[lin][i]);
    }
}

int prm[maxN];
void plusIMinusJ(int i, int j) {
    for (int lin=0; lin<2; lin++) {
        prm[i] = 1, prm[j] = 2;
        int cnt = 2;
        for (int k=1; k<=N; k++)
            if (k != i && k != j)
                prm[k] = ++cnt;
        for (int k=1; k<=N; k++)
            curr[k] = plusMinus[lin][prm[k]];
        addCurr();
    }
}

int main() {
//    freopen("../input", "r", stdin);
    //freopen("../output", "w", stdout);

    scanf("%d", &N), curr.resize(N + 1), init(N);
    int sum = 0;
    for (int i=1; i<=N; i++)
        scanf("%d", &a[i]), sum = (sum + a[i]) % N;
    if (sum != 0) {
        for (int i=1; i<=N; i++)
            curr[i] = i, sum = (sum + i) % N;
        addCurr();
        if (sum != 0) {
            printf("No\n");
            exit(0);
        }
    }
    int steps = 0;
    while(++steps < 1e5) {
        int minPos = 1, maxPos = 1;
        for (int i=2; i<=N; i++) {
            if (a[i] > a[maxPos])
                maxPos = i;
            if (a[i] < a[minPos])
                minPos = i;
        }
        if (a[maxPos] == a[minPos])
            break;
        if (a[maxPos] >= a[minPos] + N)
            addN(minPos);
        else
            plusIMinusJ(minPos, maxPos);
        if (DBG) {
            for (int i = 1; i <= N; i++)
                printf("%d ", a[i]);
            printf("\n");
            if (steps == 20)
                break;
        }
    }
    print();
    return 0;
}

/*const int seed = time (0);
mt19937 gen (seed);
long long getRand(long long a, long long b) {return uniform_int_distribution < long long > (a, b) (gen);}*/

提出情報

提出日時
問題 C - Permutation Addition
ユーザ geniucos
言語 C++ (GCC 9.2.1)
得点 500
コード長 3188 Byte
結果 AC
実行時間 10 ms
メモリ 3964 KiB

コンパイルエラー

./Main.cpp: In function ‘void print()’:
./Main.cpp:48:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘std::vector<std::vector<int> >::size_type’ {aka ‘long unsigned int’} [-Wformat=]
   48 |     printf("%d\n", ans.size());
      |             ~^     ~~~~~~~~~~
      |              |             |
      |              int           std::vector<std::vector<int> >::size_type {aka long unsigned int}
      |             %ld
./Main.cpp: In function ‘int main()’:
./Main.cpp:93:10: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   93 |     scanf("%d", &N), curr.resize(N + 1), init(N);
      |     ~~~~~^~~~~~~~~~
./Main.cpp:96:14: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   96 |         scanf("%d", &a[i]), sum = (sum + a[i]) % N;
      |         ~~~~~^~~~~~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 3
AC × 44
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_rnd_00.txt, 01_rnd_01.txt, 01_rnd_02.txt, 01_rnd_03.txt, 01_rnd_04.txt, 01_rnd_05.txt, 02_min_00.txt, 02_min_01.txt, 02_min_02.txt, 02_min_03.txt, 02_min_04.txt, 02_min_05.txt, 02_min_06.txt, 02_min_07.txt, 02_min_08.txt, 02_min_09.txt, 02_min_10.txt, 02_min_11.txt, 02_min_12.txt, 02_min_13.txt, 02_min_14.txt, 03_max_00.txt, 03_max_01.txt, 03_max_02.txt, 03_max_03.txt, 03_max_04.txt, 03_max_05.txt, 03_max_06.txt, 03_max_07.txt, 03_max_08.txt, 03_max_09.txt, 03_max_10.txt, 03_max_11.txt, 03_max_12.txt, 03_max_13.txt, 03_max_14.txt, 04_same_00.txt, 04_same_01.txt, 04_same_02.txt, 04_same_03.txt, 04_same_04.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 6 ms 3616 KiB
00_sample_01.txt AC 2 ms 3484 KiB
00_sample_02.txt AC 2 ms 3680 KiB
01_rnd_00.txt AC 2 ms 3480 KiB
01_rnd_01.txt AC 2 ms 3620 KiB
01_rnd_02.txt AC 2 ms 3616 KiB
01_rnd_03.txt AC 2 ms 3532 KiB
01_rnd_04.txt AC 2 ms 3628 KiB
01_rnd_05.txt AC 2 ms 3476 KiB
02_min_00.txt AC 2 ms 3648 KiB
02_min_01.txt AC 2 ms 3696 KiB
02_min_02.txt AC 2 ms 3708 KiB
02_min_03.txt AC 2 ms 3532 KiB
02_min_04.txt AC 2 ms 3476 KiB
02_min_05.txt AC 2 ms 3612 KiB
02_min_06.txt AC 2 ms 3512 KiB
02_min_07.txt AC 2 ms 3696 KiB
02_min_08.txt AC 3 ms 3620 KiB
02_min_09.txt AC 2 ms 3744 KiB
02_min_10.txt AC 2 ms 3492 KiB
02_min_11.txt AC 2 ms 3644 KiB
02_min_12.txt AC 2 ms 3556 KiB
02_min_13.txt AC 2 ms 3508 KiB
02_min_14.txt AC 2 ms 3612 KiB
03_max_00.txt AC 7 ms 3772 KiB
03_max_01.txt AC 2 ms 3564 KiB
03_max_02.txt AC 5 ms 3732 KiB
03_max_03.txt AC 2 ms 3628 KiB
03_max_04.txt AC 2 ms 3792 KiB
03_max_05.txt AC 2 ms 3656 KiB
03_max_06.txt AC 2 ms 3480 KiB
03_max_07.txt AC 2 ms 3516 KiB
03_max_08.txt AC 3 ms 3652 KiB
03_max_09.txt AC 2 ms 3600 KiB
03_max_10.txt AC 6 ms 3792 KiB
03_max_11.txt AC 10 ms 3756 KiB
03_max_12.txt AC 10 ms 3964 KiB
03_max_13.txt AC 2 ms 3684 KiB
03_max_14.txt AC 4 ms 3776 KiB
04_same_00.txt AC 3 ms 3572 KiB
04_same_01.txt AC 2 ms 3576 KiB
04_same_02.txt AC 2 ms 3600 KiB
04_same_03.txt AC 1 ms 3600 KiB
04_same_04.txt AC 2 ms 3648 KiB