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
AC × 3
AC × 83
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