結果
| 問題 | No.3510 RPS Eliminations |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-19 18:49:22 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,121 bytes |
| 記録 | |
| コンパイル時間 | 2,574 ms |
| コンパイル使用メモリ | 343,068 KB |
| 実行使用メモリ | 35,856 KB |
| 最終ジャッジ日時 | 2026-04-19 18:49:34 |
| 合計ジャッジ時間 | 9,748 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 5 WA * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int WIN_TBL[3][3] = {
{-1, 0, 2},
{ 0,-1, 1},
{ 2, 1,-1}
};
const int MAXN = 200002;
int par[2*MAXN], lc[2*MAXN], rc[2*MAXN];
ll dp[2*MAXN][3];
int root_node;
int N_global;
void combine(int v) {
ll* dl = dp[lc[v]];
ll* dr = dp[rc[v]];
ll* res = dp[v];
res[0] = res[1] = res[2] = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (WIN_TBL[i][j] != -1)
res[WIN_TBL[i][j]] += dl[i] * dr[j];
}
void update_up(int leaf) {
int v = par[leaf];
while (v != -1) {
combine(v);
v = par[v];
}
}
void solve() {
int N; ll K;
cin >> N >> K;
vector<int> A(N-1);
for (int& x : A) cin >> x;
vector<int> prev_slot(2*N, -1), next_slot(2*N, -1);
for (int i = 0; i < N; i++) {
prev_slot[i] = i-1;
next_slot[i] = (i < N-1) ? i+1 : -1;
}
vector<int> bit(N+1, 0);
auto bit_update = [&](int i, int val) {
for (i++; i <= N; i += i & (-i)) bit[i] += val;
};
auto bit_query = [&](int i) {
int s = 0;
for (i++; i > 0; i -= i & (-i)) s += bit[i];
return s;
};
auto kth = [&](int k) -> int {
int pos = 0;
for (int pw = 1 << 18; pw; pw >>= 1)
if (pos + pw <= N && bit[pos + pw] < k) {
pos += pw;
k -= bit[pos];
}
return pos;
};
for (int i = 0; i < N; i++) bit_update(i, 1);
fill(par, par + 2*N, -1);
int next_node = N;
vector<int> orig_to_node(N);
iota(orig_to_node.begin(), orig_to_node.end(), 0);
vector<int> node_left(2*N, 0);
fill(bit.begin(), bit.end(), 0);
for (int i = 0; i < N; i++) bit_update(i, 1);
vector<int> left_to_node(N, -1);
for (int i = 0; i < N; i++) left_to_node[i] = i;
vector<int> node_right(2*N, 0);
for (int i = 0; i < N; i++) node_right[i] = i;
for (int i = 0; i < N-1; i++) {
int left_a = kth(A[i]);
int node_a = left_to_node[left_a];
int left_b = node_right[node_a] + 1;
int node_b = left_to_node[left_b];
int v = next_node++;
lc[v] = node_a;
rc[v] = node_b;
par[node_a] = par[node_b] = v;
node_left[v] = node_left[node_a];
node_right[v] = node_right[node_b];
bit_update(left_b, -1);
left_to_node[left_a] = v;
}
root_node = left_to_node[0];
for (int i = 0; i < N; i++)
dp[i][0] = dp[i][1] = dp[i][2] = 1;
for (int v = N; v < 2*N-1; v++)
combine(v);
vector<array<ll,3>> dp_init(2*N-1);
for (int v = 0; v < 2*N-1; v++)
dp_init[v] = {dp[v][0], dp[v][1], dp[v][2]};
string chars = "PRS";
string results[3];
for (int target_idx = 0; target_idx < 3; target_idx++) {
if (dp_init[root_node][target_idx] < K) {
results[target_idx] = "-1";
continue;
}
for (int v = 0; v < 2*N-1; v++)
for (int t = 0; t < 3; t++)
dp[v][t] = dp_init[v][t];
ll rem = K;
string ans(N, ' ');
for (int leaf_j = 0; leaf_j < N; leaf_j++) {
for (int ci = 0; ci < 3; ci++) {
ll saved[3] = {dp[leaf_j][0], dp[leaf_j][1], dp[leaf_j][2]};
dp[leaf_j][0] = dp[leaf_j][1] = dp[leaf_j][2] = 0;
dp[leaf_j][ci] = 1;
update_up(leaf_j);
ll cnt = dp[root_node][target_idx];
if (cnt >= rem) {
ans[leaf_j] = chars[ci];
break;
} else {
rem -= cnt;
for (int t = 0; t < 3; t++) dp[leaf_j][t] = saved[t];
update_up(leaf_j);
}
}
}
results[target_idx] = ans;
}
cout << results[1] << "\n" << results[0] << "\n" << results[2] << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
while (T--) solve();
return 0;
}