結果
| 問題 | No.3562 Communicate Sorted Vector |
| コンテスト | |
| ユーザー |
jastaway
|
| 提出日時 | 2026-05-28 10:39:43 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,224 bytes |
| 記録 | |
| コンパイル時間 | 2,789 ms |
| コンパイル使用メモリ | 353,860 KB |
| 実行使用メモリ | 48,496 KB |
| 平均クエリ数 | 0.11 |
| 最終ジャッジ日時 | 2026-05-29 18:48:27 |
| 合計ジャッジ時間 | 7,834 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge1_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 5 TLE * 1 -- * 39 |
| 部分点2 | 25 % | -- * 45 |
| 部分点3 | 65 % | -- * 46 |
| 合計 | 0 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const string one = "";
string to_str(int num)
{
if(num == 1) return one;
string ret = "";
while(num)
{
ret.push_back('0' + (num&1));
num >>= 1;
}
ret.pop_back();
reverse(ret.begin(), ret.end());
return ret;
}
int to_num(const string& s)
{
if(s == one) return 1;
int ret = 1;
for(char c : s)
{
ret <<= 1;
ret += c - '0';
}
return ret;
}
vector<int> get_factorials(int N) {
vector<int> fact(N + 1, 1);
for (int i = 1; i <= N; ++i) {
fact[i] = fact[i - 1] * i;
}
return fact;
}
vector<int> get_permutation_at(int N, long long k) {
auto fact = get_factorials(N);
// 利用可能な数字のリスト [1, 2, ..., N]
vector<int> digits(N);
iota(digits.begin(), digits.end(), 1);
vector<int> result;
k--; // 0-indexed に変換
for (int i = N - 1; i >= 0; --i) {
long long f = fact[i]; // 残りの桁の並べ方(通り数)
int idx = k / f; // 現在の桁で選ぶべき数字のインデックス
k %= f; // 次の桁への余り
result.push_back(digits[idx]);
digits.erase(digits.begin() + idx); // 使用した数字を削除
}
return result;
}
int get_permutation_index(const vector<int>& p)
{
int N = p.size();
auto fact = get_factorials(N);
vector<bool> used(N + 1, false);
int rank = 0;
for (int i = 0; i < N; ++i) {
int f = fact[N - 1 - i]; // この位置より後ろの並べ方
// p[i] より小さく、かつ「まだ使われていない」数字の個数を数える
int count = 0;
for (int j = 1; j < p[i]; ++j) {
if (!used[j]) {
count++;
}
}
rank += count * f;
used[p[i]] = true; // 使用済みにする
}
return rank + 1; // 1-indexed に戻して返す
}
void Alice()
{
int N, Q; cin >> N >> Q;
vector<int> A(N);
for(auto& a : A) cin >> a;
vector<string> S(min(N, 13));
for(int i = 0; i < min(N, 13); i++)
{
S[i] = to_str(A[i]);
}
if(N == 14)
{
auto perm = get_permutation_at(N-1, A[N-1]);
vector<string> nS(N-1);
for(int i = 0; i < N-1; i++) nS[i] = S[perm[i]-1];
S.swap(nS);
}
cout << S.size() << endl;
for(auto& s : S) cout << s << endl;
return;
}
void Bob()
{
int N, Q; cin >> N >> Q;
int K; cin >> K;
vector<string> S(K);
for(auto& s : S) cin >> s;
vector<int> A(N);
for(int i = 0; i < min(N, 13); i++) A[i] = to_num(S[i]);
if(N == 14)
{
vector<int> I(K), perm(K);
iota(I.begin(), I.end(), 0);
sort(I.begin(), I.end(), [&](int i, int j){ return A[i] < A[j]; });
for(int i = 0; i < K; i++) perm[I[i]] = i + 1;
A[N-1] = get_permutation_index(perm);
}
sort(A.begin(), A.end());
for(int i = 0; i < N; i++) cout << A[i] << (i < N-1 ? " " : "\n");
cout << flush;
return;
}
int main()
{
string player; cin >> player;
if(player == "Alice") Alice();
else Bob();
}
jastaway