結果

問題 No.3562 Communicate Sorted Vector
コンテスト
ユーザー TKTYI
提出日時 2026-05-25 07:32:37
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,431 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,770 ms
コンパイル使用メモリ 349,360 KB
実行使用メモリ 30,320 KB
平均クエリ数 3.00
最終ジャッジ日時 2026-05-29 18:38:27
合計ジャッジ時間 37,843 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
部分点1 10 % AC * 45
部分点2 25 % AC * 45
部分点3 65 % RE * 46
合計 35 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    string S;
    cin >> S;
    assert(S == "Alice" || S == "Bob");
    int N, Q;
    cin >> N >> Q;
    assert(1 <= N && N <= 14);
    assert(Q == 380 || Q == 410 || Q == 420);
    vector<long long> F(20, 1);
    for (int i = 1; i < 20; i++) F[i] = F[i - 1] * i;
    if (S == "Alice") {
        vector<int> A(N);
        for (int i = 0; i < N; i++) cin >> A[i];
        assert(1 <= A[0]);
        for (int i = 0; i < N - 1; i++) {
            assert(A[i] < A[i + 1]);
        }
        assert(A.back() <= 1'000'000'000);

        vector<string> T(N);
        for (int i = 0; i < min(N, 13); i++) {
            A[i]++;
            while (A[i] > 1) {
                T[i] += (char)('0' + (A[i] & 1));
                A[i] >>= 1;
            }
        }
        if (N < 14) {
            cout << N << endl;
            for (int i = 0; i < N; i++) cout << T[i] << endl;
            return 0;
        }
        A[N - 1]--;
        vector<string> S(N - 1);
        for (int i = 0; i < N - 1; i++) {
            S[i] = T[A[N - 1] / F[N - 2 - i]];
            T.erase(T.begin() + A[N - 1] / F[N - 2 - i]);
            A[N - 1] %= F[N - 2 - i];
        }
        cout << N - 1 << endl;
        for (auto s : S) cout << s << endl;
    }
    else {
        int K;
        cin >> K;
        assert(1 <= K && K <= N);
        vector<string> S(K);
        for (int i = 0; i < K; i++) {
            cin >> S[i];
            Q -= S[i].size();
            for (auto c : S[i]) {
                assert(c == '0' || c == '1');
            }
        }
        assert(Q >= 0);
        vector<int> B(N);
        for (int i = 0; i < K; i++) {
            S[i] += '1';
            reverse(S[i].begin(), S[i].end());
            for (auto c : S[i]) B[i] = 2 * B[i] + c - '0';
            B[i]--;
        }
        if (N < 14) {
            assert(K == N);
            for (int i = 0; i < N; i++) cout << B[i] << " \n"[i == N - 1];
            return 0;
        }
        B[N - 1] = 1;
        for (int i = 0; i < N - 1; i++) {
            for (int  j = i + 1; j < N - 1; j++) {
                if (B[i] > B[j]) {
                    B[N - 1] += F[N - 2 - i];
                }
            }
        }
        sort(B.begin(), B.end());
        for (int i = 0; i < N; i++) cout << B[i] << " \n"[i == N - 1];
    }
    return 0;
}
0