結果
| 問題 | No.3510 RPS Eliminations |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-19 18:39:33 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,701 bytes |
| 記録 | |
| コンパイル時間 | 1,557 ms |
| コンパイル使用メモリ | 219,772 KB |
| 実行使用メモリ | 30,848 KB |
| 最終ジャッジ日時 | 2026-04-19 18:39:40 |
| 合計ジャッジ時間 | 6,813 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 5 WA * 23 |
コンパイルメッセージ
In file included from /home/linuxbrew/.linuxbrew/Cellar/gcc/15.2.0_1/include/c++/15/algorithm:62,
from /home/linuxbrew/.linuxbrew/Cellar/gcc/15.2.0_1/include/c++/15/x86_64-pc-linux-gnu/bits/stdc++.h:53,
from main.cpp:1:
In function 'void std::__fill_a1(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = int*; _Tp = int]',
inlined from 'void std::__fill_a(_FIte, _FIte, const _Tp&) [with _FIte = int*; _Tp = int]' at /home/linuxbrew/.linuxbrew/Cellar/gcc/15.2.0_1/include/c++/15/bits/stl_algobase.h:979:21,
inlined from 'void std::fill(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = int*; _Tp = int]' at /home/linuxbrew/.linuxbrew/Cellar/gcc/15.2.0_1/include/c++/15/bits/stl_algobase.h:1011:20,
inlined from 'void solve()' at main.cpp:61:9:
/home/linuxbrew/.linuxbrew/Cellar/gcc/15.2.0_1/include/c++/15/bits/stl_algobase.h:925:18: warning: 'void* __builtin_memset(void*, int, long unsigned int)' specified bound 18446744073709551608 exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]
925 | *__first = __val;
| ~~~~~~~~~^~~~~~~
ソースコード
#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> bit(N+1, 0);
auto bit_update = [&](int i, int val) {
for (i++; i <= N; i += i & (-i)) bit[i] += val;
};
auto kth = [&](int k) -> int {
int pos = 0;
for (int pw = 1 << 17; 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> node_left(2*N, 0);
vector<int> node_right(2*N, 0);
vector<int> left_to_node(N, -1);
for (int i = 0; i < N; i++) {
node_left[i] = node_right[i] = i;
left_to_node[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);
if (ci == 2) ans[leaf_j] = chars[2];
}
}
}
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;
}