Submission #58993936
Source Code Expand
import std;
void main () {
int N;
long K;
readln.read(N, K);
auto X = readln.split.to!(int[]);
auto A = readln.split.to!(int[]);
X[] -= 1;
auto fg = new FunctionalGraph(N);
foreach (i; 0..N) {
fg.add_edge(i, X[i]);
}
fg.build();
auto B = new int[](N);
foreach (i; 0..N) {
int j = fg.move_k(i, K);
B[i] = A[j];
}
foreach (i; 0..N) {
write(B[i], i == N - 1 ? '\n' : ' ');
}
}
void read (T...) (string S, ref T args) {
import std.conv : to;
import std.array : split;
auto buf = S.split;
foreach (i, ref arg; args) {
arg = buf[i].to!(typeof(arg));
}
}
class FunctionalGraph {
int N;
int[] next;
int[] roop;
int[] roop_start;
int[] roop_size;
int[] place;
int[][] doubling;
int max_table_size = 0;
bool built = false;
this (int N) {
this.N = N;
roop = new int[](N);
roop_start = new int[](N);
roop_start[] = -1;
roop_size = new int[](N);
roop_size[] = -1;
place = new int[](N);
place[] = -1;
next = new int[](N);
next[] = -1;
import core.bitop : bsr;
max_table_size = bsr(N) + 1;
doubling = new int[][](max_table_size, N);
}
void add_edge (int from, int to)
in {
assert(next[from] == -1);
assert(0 <= from && from < N);
assert(0 <= to && to < N);
}
do {
next[from] = to;
}
void build ()
in {
foreach (i; 0..N) assert(next[i] != -1);
}
do {
// ループを検出: O(N)時間
auto vis = new bool[](N);
auto work = new int[](N);
int latest = 0;
foreach (i; 0..N) {
if (vis[i]) continue;
work.length = 0;
int cur = i;
while (!vis[cur]) {
vis[cur] = true;
work ~= cur;
cur = next[cur];
}
int start = -1;
foreach (w; 0..work.length) {
if (work[w] == cur) {
start = w.to!int;
break;
}
}
if (start == -1) continue;
int rs = latest;
int wl = work.length.to!int;
foreach (w; work[start..$]) {
roop[latest] = w;
roop_start[w] = rs;
roop_size[w] = wl - start;
place[w] = latest - rs;
latest++;
}
}
// ダブリング構築: O(NlogN)時間
foreach (i; 0..N) {
doubling[0][i] = next[i];
}
foreach (i; 0..max_table_size - 1) {
foreach (j; 0..N) {
auto v = doubling[i][j];
doubling[i + 1][j] = doubling[i][v];
}
}
built = true;
}
int move_k (int fr, long K)
in {
assert(0 <= K);
assert(built);
}
do {
// ダブリングしながらループに入った時点でreturn
foreach_reverse (i; 0..max_table_size) {
if (roop_start[fr] != -1) {
break;
}
if ((1 << i) <= K) {
fr = doubling[i][fr];
K -= (1 << i);
}
}
if (K == 0) {
return fr;
}
int suc = (K + place[fr]) % roop_size[fr];
return roop[roop_start[fr] + suc];
}
}
Submission Info
| Submission Time | |
|---|---|
| Task | E - Permute K times |
| User | InTheBloom |
| Language | D (LDC 1.32.2) |
| Score | 450 |
| Code Size | 3649 Byte |
| Status | AC |
| Exec Time | 70 ms |
| Memory | 28440 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 450 / 450 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample_01.txt, sample_02.txt, sample_03.txt |
| All | sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt, test_58.txt, test_59.txt, test_60.txt, test_61.txt, test_62.txt, test_63.txt, test_64.txt, test_65.txt, test_66.txt, test_67.txt, test_68.txt, test_69.txt, test_70.txt, test_71.txt, test_72.txt, test_73.txt, test_74.txt, test_75.txt, test_76.txt, test_77.txt, test_78.txt, test_79.txt, test_80.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| sample_01.txt | AC | 1 ms | 2940 KiB |
| sample_02.txt | AC | 1 ms | 2928 KiB |
| sample_03.txt | AC | 1 ms | 2904 KiB |
| test_01.txt | AC | 1 ms | 2896 KiB |
| test_02.txt | AC | 1 ms | 2984 KiB |
| test_03.txt | AC | 17 ms | 9220 KiB |
| test_04.txt | AC | 63 ms | 27836 KiB |
| test_05.txt | AC | 54 ms | 24316 KiB |
| test_06.txt | AC | 37 ms | 17932 KiB |
| test_07.txt | AC | 3 ms | 4008 KiB |
| test_08.txt | AC | 16 ms | 9248 KiB |
| test_09.txt | AC | 37 ms | 19288 KiB |
| test_10.txt | AC | 61 ms | 27812 KiB |
| test_11.txt | AC | 61 ms | 27808 KiB |
| test_12.txt | AC | 10 ms | 7340 KiB |
| test_13.txt | AC | 29 ms | 15692 KiB |
| test_14.txt | AC | 62 ms | 27816 KiB |
| test_15.txt | AC | 7 ms | 6056 KiB |
| test_16.txt | AC | 21 ms | 12820 KiB |
| test_17.txt | AC | 13 ms | 7940 KiB |
| test_18.txt | AC | 14 ms | 8144 KiB |
| test_19.txt | AC | 29 ms | 15456 KiB |
| test_20.txt | AC | 61 ms | 27848 KiB |
| test_21.txt | AC | 61 ms | 27984 KiB |
| test_22.txt | AC | 2 ms | 3300 KiB |
| test_23.txt | AC | 65 ms | 27848 KiB |
| test_24.txt | AC | 53 ms | 27904 KiB |
| test_25.txt | AC | 54 ms | 27888 KiB |
| test_26.txt | AC | 64 ms | 27892 KiB |
| test_27.txt | AC | 53 ms | 27944 KiB |
| test_28.txt | AC | 53 ms | 27876 KiB |
| test_29.txt | AC | 6 ms | 6076 KiB |
| test_30.txt | AC | 58 ms | 27988 KiB |
| test_31.txt | AC | 57 ms | 28212 KiB |
| test_32.txt | AC | 4 ms | 4528 KiB |
| test_33.txt | AC | 54 ms | 24860 KiB |
| test_34.txt | AC | 66 ms | 27888 KiB |
| test_35.txt | AC | 30 ms | 17788 KiB |
| test_36.txt | AC | 1 ms | 3188 KiB |
| test_37.txt | AC | 26 ms | 16796 KiB |
| test_38.txt | AC | 10 ms | 6936 KiB |
| test_39.txt | AC | 57 ms | 27916 KiB |
| test_40.txt | AC | 58 ms | 27932 KiB |
| test_41.txt | AC | 62 ms | 27828 KiB |
| test_42.txt | AC | 11 ms | 7064 KiB |
| test_43.txt | AC | 10 ms | 7224 KiB |
| test_44.txt | AC | 63 ms | 27888 KiB |
| test_45.txt | AC | 15 ms | 9032 KiB |
| test_46.txt | AC | 11 ms | 7176 KiB |
| test_47.txt | AC | 56 ms | 24160 KiB |
| test_48.txt | AC | 17 ms | 9560 KiB |
| test_49.txt | AC | 41 ms | 19336 KiB |
| test_50.txt | AC | 63 ms | 27820 KiB |
| test_51.txt | AC | 62 ms | 27852 KiB |
| test_52.txt | AC | 24 ms | 14672 KiB |
| test_53.txt | AC | 14 ms | 8444 KiB |
| test_54.txt | AC | 63 ms | 27836 KiB |
| test_55.txt | AC | 17 ms | 9860 KiB |
| test_56.txt | AC | 31 ms | 16088 KiB |
| test_57.txt | AC | 28 ms | 16296 KiB |
| test_58.txt | AC | 11 ms | 7104 KiB |
| test_59.txt | AC | 61 ms | 27368 KiB |
| test_60.txt | AC | 62 ms | 27760 KiB |
| test_61.txt | AC | 64 ms | 27900 KiB |
| test_62.txt | AC | 51 ms | 27824 KiB |
| test_63.txt | AC | 63 ms | 27844 KiB |
| test_64.txt | AC | 54 ms | 27976 KiB |
| test_65.txt | AC | 25 ms | 16152 KiB |
| test_66.txt | AC | 37 ms | 18816 KiB |
| test_67.txt | AC | 22 ms | 13872 KiB |
| test_68.txt | AC | 10 ms | 7224 KiB |
| test_69.txt | AC | 36 ms | 19376 KiB |
| test_70.txt | AC | 62 ms | 27552 KiB |
| test_71.txt | AC | 59 ms | 27840 KiB |
| test_72.txt | AC | 48 ms | 22228 KiB |
| test_73.txt | AC | 13 ms | 8156 KiB |
| test_74.txt | AC | 61 ms | 28440 KiB |
| test_75.txt | AC | 67 ms | 27776 KiB |
| test_76.txt | AC | 67 ms | 27908 KiB |
| test_77.txt | AC | 69 ms | 28084 KiB |
| test_78.txt | AC | 66 ms | 27940 KiB |
| test_79.txt | AC | 70 ms | 27944 KiB |
| test_80.txt | AC | 65 ms | 27636 KiB |