結果
| 問題 | No.3562 Communicate Sorted Vector |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-25 07:37:07 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,454 bytes |
| 記録 | |
| コンパイル時間 | 4,085 ms |
| コンパイル使用メモリ | 347,984 KB |
| 実行使用メモリ | 30,320 KB |
| 平均クエリ数 | 3.00 |
| 最終ジャッジ日時 | 2026-05-29 18:39:03 |
| 合計ジャッジ時間 | 41,794 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge1_1 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 45 |
| 部分点2 | 25 % | RE * 45 |
| 部分点3 | 65 % | RE * 46 |
| 合計 | 10 点 |
ソースコード
#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);
assert(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;
}