Submission #56852439
Source Code Expand
use nekolib::fmt::SpaceSep;
use proconio::{input, marker::Usize1};
fn main() {
input! {
n: usize,
k: u64,
x: [Usize1; n],
a: [u32; n],
}
let f = N1FnGraph::new(&x);
let xk = f.step_each(k);
let res: Vec<_> = xk.iter().map(|&i| a[i]).collect();
println!("{}", SpaceSep(&res));
}
struct N1FnGraph {
g: Vec<Vec<usize>>,
cycle: Vec<Vec<usize>>,
}
impl N1FnGraph {
pub fn new(f: &[usize]) -> Self {
let n = f.len();
let (par, cycle) = Self::par_cycle(f);
let mut g = vec![vec![]; n + 1];
for i in 0..n {
g[par[i]].push(i);
}
Self { g, cycle }
}
pub fn step_each(&self, k: u64) -> Vec<usize> {
fn dfs(
g: &[Vec<usize>],
v: usize,
path: &mut Vec<usize>,
k: u64,
res: &mut [usize],
cycle: &[Vec<usize>],
) {
if v < res.len() {
// path: [n, ..., v]
let pl = path.len();
res[v] = if (pl as u64) - 1 > k {
path[pl - 1 - k as usize]
} else {
let r = path[1];
let cl = cycle[r].len();
let i = (k - (pl - 1) as u64) % cl as u64;
cycle[r][i as usize]
};
}
for &nv in &g[v] {
path.push(nv);
dfs(g, nv, path, k, res, cycle);
path.pop();
}
}
let n = self.g.len() - 1;
let mut res = vec![n; n];
dfs(&self.g, n, &mut vec![n], k, &mut res, &self.cycle);
res
}
fn par_cycle(f: &[usize]) -> (Vec<usize>, Vec<Vec<usize>>) {
let n = f.len();
let mut par = f.to_owned();
par.push(n);
let mut cycle = vec![vec![]; n];
let mut seen = vec![false; n];
let mut stack = vec![];
let mut index = vec![n; n];
for mut i in 0..n {
while !seen[i] {
if index[i] < n {
break;
}
index[i] = stack.len();
stack.push(i);
i = f[i];
}
if !seen[i] {
let s = i;
let mut c = vec![];
while let Some(j) = stack.pop() {
c.push(j);
seen[j] = true;
if j == s {
break;
}
}
let r = c[0];
c.reverse();
cycle[r] = c;
par[r] = n;
}
while let Some(j) = stack.pop() {
seen[j] = true;
}
}
(par, cycle)
}
}
/// This module is bundled automatically.
/// See <https://rsk0315.github.io/nekolib/nekolib_doc/index.html> for documentation.
/// Commit: d829603bb021542857778d68b3de948ff48aff91-dirty
#[allow(unused)]
pub mod nekolib {
pub mod fmt {
pub mod str_sep {
use std::fmt;
pub struct SpaceSep<I>(pub I);
pub struct PerLine<I>(pub I);
pub struct StrSep<'a, I>(pub I, pub &'a str);
pub struct SpaceSepUsize1<I>(pub I);
pub struct PerLineUsize1<I>(pub I);
pub struct StrSepUsize1<'a, I>(pub I, pub &'a str);
macro_rules! impl_fmt {
( $( $fmt:ident )* ) => { $(
#[allow(non_snake_case)]
fn $fmt<I, T: fmt::$fmt>(iter: I, sep: &str, f: &mut fmt::Formatter<'_>) -> fmt::Result
where
I: IntoIterator<Item = T>,
{
let mut iter = iter.into_iter();
if let Some(first) = iter.by_ref().next() {
first.fmt(f)?;
}
iter.map(|rest| { write!(f, "{}", sep)?; rest.fmt(f) }).collect()
}
impl<I, T: fmt::$fmt> fmt::$fmt for SpaceSep<I>
where
I: IntoIterator<Item = T> + Clone,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$fmt(self.0.clone(), " ", f)
}
}
impl<I, T: fmt::$fmt> fmt::$fmt for PerLine<I>
where
I: IntoIterator<Item = T> + Clone,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$fmt(self.0.clone(), "\n", f)
}
}
impl<I, T: fmt::$fmt> fmt::$fmt for StrSep<'_, I>
where
I: IntoIterator<Item = T> + Clone,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$fmt(self.0.clone(), self.1, f)
}
}
)* }
}
macro_rules! impl_fmt_usize1 {
( $( $fmt:ident )* ) => { $(
impl<I, T> fmt::$fmt for SpaceSepUsize1<I>
where
I: IntoIterator<Item = T> + Clone,
T: std::ops::Add<usize, Output = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$fmt(self.0.clone().into_iter().map(|u| u + 1), " ", f)
}
}
impl<I, T> fmt::$fmt for PerLineUsize1<I>
where
I: IntoIterator<Item = T> + Clone,
T: std::ops::Add<usize, Output = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$fmt(self.0.clone().into_iter().map(|u| u + 1), "\n", f)
}
}
impl<I, T> fmt::$fmt for StrSepUsize1<'_, I>
where
I: IntoIterator<Item = T> + Clone,
T: std::ops::Add<usize, Output = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$fmt(self.0.clone().into_iter().map(|u| u + 1), self.1, f)
}
}
)* }
}
impl_fmt! { Binary Debug Display LowerExp LowerHex Octal Pointer UpperExp UpperHex }
impl_fmt_usize1! { Debug Display LowerHex Octal UpperHex }
}
#[allow(unused_imports)]
pub use str_sep::*;
}
}
Submission Info
Submission Time |
|
Task |
E - Permute K times |
User |
rsk0315 |
Language |
Rust (rustc 1.70.0) |
Score |
450 |
Code Size |
7091 Byte |
Status |
AC |
Exec Time |
87 ms |
Memory |
51940 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 |
1948 KiB |
sample_02.txt |
AC |
1 ms |
1892 KiB |
sample_03.txt |
AC |
1 ms |
1920 KiB |
test_01.txt |
AC |
0 ms |
2028 KiB |
test_02.txt |
AC |
0 ms |
1808 KiB |
test_03.txt |
AC |
18 ms |
12348 KiB |
test_04.txt |
AC |
87 ms |
37372 KiB |
test_05.txt |
AC |
86 ms |
45820 KiB |
test_06.txt |
AC |
49 ms |
30032 KiB |
test_07.txt |
AC |
3 ms |
3520 KiB |
test_08.txt |
AC |
18 ms |
13128 KiB |
test_09.txt |
AC |
49 ms |
30324 KiB |
test_10.txt |
AC |
78 ms |
43864 KiB |
test_11.txt |
AC |
85 ms |
46836 KiB |
test_12.txt |
AC |
9 ms |
7744 KiB |
test_13.txt |
AC |
42 ms |
24600 KiB |
test_14.txt |
AC |
86 ms |
44780 KiB |
test_15.txt |
AC |
7 ms |
6772 KiB |
test_16.txt |
AC |
26 ms |
16152 KiB |
test_17.txt |
AC |
13 ms |
10528 KiB |
test_18.txt |
AC |
14 ms |
10668 KiB |
test_19.txt |
AC |
45 ms |
26684 KiB |
test_20.txt |
AC |
86 ms |
49288 KiB |
test_21.txt |
AC |
86 ms |
45340 KiB |
test_22.txt |
AC |
2 ms |
2948 KiB |
test_23.txt |
AC |
36 ms |
29420 KiB |
test_24.txt |
AC |
49 ms |
51940 KiB |
test_25.txt |
AC |
48 ms |
51900 KiB |
test_26.txt |
AC |
37 ms |
29488 KiB |
test_27.txt |
AC |
49 ms |
51912 KiB |
test_28.txt |
AC |
48 ms |
51932 KiB |
test_29.txt |
AC |
5 ms |
4704 KiB |
test_30.txt |
AC |
71 ms |
29888 KiB |
test_31.txt |
AC |
83 ms |
30504 KiB |
test_32.txt |
AC |
3 ms |
3500 KiB |
test_33.txt |
AC |
71 ms |
28508 KiB |
test_34.txt |
AC |
76 ms |
31672 KiB |
test_35.txt |
AC |
30 ms |
15548 KiB |
test_36.txt |
AC |
1 ms |
2496 KiB |
test_37.txt |
AC |
32 ms |
16032 KiB |
test_38.txt |
AC |
11 ms |
8740 KiB |
test_39.txt |
AC |
87 ms |
36108 KiB |
test_40.txt |
AC |
82 ms |
40588 KiB |
test_41.txt |
AC |
51 ms |
24492 KiB |
test_42.txt |
AC |
8 ms |
5384 KiB |
test_43.txt |
AC |
7 ms |
5144 KiB |
test_44.txt |
AC |
51 ms |
24460 KiB |
test_45.txt |
AC |
12 ms |
7676 KiB |
test_46.txt |
AC |
8 ms |
5672 KiB |
test_47.txt |
AC |
48 ms |
22188 KiB |
test_48.txt |
AC |
13 ms |
8040 KiB |
test_49.txt |
AC |
35 ms |
17192 KiB |
test_50.txt |
AC |
53 ms |
24420 KiB |
test_51.txt |
AC |
50 ms |
24488 KiB |
test_52.txt |
AC |
19 ms |
10584 KiB |
test_53.txt |
AC |
11 ms |
6968 KiB |
test_54.txt |
AC |
50 ms |
24496 KiB |
test_55.txt |
AC |
14 ms |
8232 KiB |
test_56.txt |
AC |
26 ms |
13900 KiB |
test_57.txt |
AC |
22 ms |
12160 KiB |
test_58.txt |
AC |
7 ms |
5592 KiB |
test_59.txt |
AC |
49 ms |
23808 KiB |
test_60.txt |
AC |
53 ms |
24492 KiB |
test_61.txt |
AC |
45 ms |
50328 KiB |
test_62.txt |
AC |
46 ms |
50456 KiB |
test_63.txt |
AC |
44 ms |
50368 KiB |
test_64.txt |
AC |
48 ms |
50340 KiB |
test_65.txt |
AC |
31 ms |
18692 KiB |
test_66.txt |
AC |
49 ms |
20456 KiB |
test_67.txt |
AC |
22 ms |
12448 KiB |
test_68.txt |
AC |
11 ms |
7096 KiB |
test_69.txt |
AC |
51 ms |
26372 KiB |
test_70.txt |
AC |
76 ms |
29700 KiB |
test_71.txt |
AC |
79 ms |
42656 KiB |
test_72.txt |
AC |
60 ms |
27700 KiB |
test_73.txt |
AC |
15 ms |
13068 KiB |
test_74.txt |
AC |
78 ms |
30644 KiB |
test_75.txt |
AC |
52 ms |
24404 KiB |
test_76.txt |
AC |
50 ms |
24500 KiB |
test_77.txt |
AC |
29 ms |
20284 KiB |
test_78.txt |
AC |
28 ms |
20180 KiB |
test_79.txt |
AC |
29 ms |
20268 KiB |
test_80.txt |
AC |
27 ms |
20064 KiB |