/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 284.0 KiB
#2 Accepted 3ms 516.0 KiB
#3 Accepted 3ms 284.0 KiB
#4 Accepted 2ms 284.0 KiB
#5 Accepted 2ms 284.0 KiB
#6 Accepted 2ms 324.0 KiB
#7 Accepted 3ms 288.0 KiB
#8 Accepted 3ms 352.0 KiB
#9 Accepted 3ms 284.0 KiB
#10 Accepted 1ms 324.0 KiB
#11 Accepted 1ms 284.0 KiB
#12 Accepted 1ms 284.0 KiB
#13 Accepted 3ms 284.0 KiB
#14 Accepted 2ms 284.0 KiB
#15 Accepted 2ms 284.0 KiB
#16 Accepted 2ms 284.0 KiB
#17 Accepted 2ms 284.0 KiB
#18 Accepted 1ms 284.0 KiB
#19 Accepted 3ms 284.0 KiB
#20 Accepted 3ms 284.0 KiB
#21 Accepted 1ms 284.0 KiB
#22 Accepted 3ms 284.0 KiB
#23 Accepted 3ms 320.0 KiB
#24 Accepted 1ms 324.0 KiB
#25 Accepted 1ms 284.0 KiB
#26 Accepted 3ms 284.0 KiB
#27 Accepted 3ms 284.0 KiB
#28 Accepted 3ms 284.0 KiB
#29 Accepted 3ms 284.0 KiB
#30 Accepted 2ms 284.0 KiB
#31 Accepted 2ms 284.0 KiB
#32 Accepted 2ms 320.0 KiB
#33 Accepted 3ms 284.0 KiB
#34 Accepted 1ms 284.0 KiB
#35 Accepted 3ms 284.0 KiB
#36 Accepted 2ms 284.0 KiB
#37 Accepted 1ms 284.0 KiB
#38 Accepted 1ms 284.0 KiB
#39 Accepted 1ms 284.0 KiB
#40 Accepted 1ms 284.0 KiB
#41 Accepted 1ms 284.0 KiB
#42 Accepted 2ms 284.0 KiB
#43 Accepted 3ms 284.0 KiB
#44 Accepted 3ms 320.0 KiB
#45 Accepted 3ms 284.0 KiB
#46 Accepted 3ms 284.0 KiB
#47 Accepted 2ms 516.0 KiB
#48 Accepted 1ms 284.0 KiB
#49 Accepted 3ms 284.0 KiB
#50 Accepted 3ms 284.0 KiB
#51 Accepted 2ms 284.0 KiB
#52 Accepted 2ms 284.0 KiB
#53 Accepted 2ms 284.0 KiB
#54 Accepted 1ms 284.0 KiB
#55 Accepted 1ms 284.0 KiB
#56 Accepted 2ms 284.0 KiB
#57 Accepted 1ms 284.0 KiB
#58 Accepted 1ms 284.0 KiB
#59 Accepted 1ms 284.0 KiB
#60 Accepted 1ms 284.0 KiB
#61 Accepted 2ms 284.0 KiB
#62 Accepted 3ms 320.0 KiB
#63 Accepted 3ms 284.0 KiB
#64 Accepted 3ms 284.0 KiB
#65 Accepted 3ms 320.0 KiB
#66 Accepted 3ms 284.0 KiB
#67 Accepted 2ms 284.0 KiB
#68 Accepted 2ms 284.0 KiB
#69 Accepted 3ms 284.0 KiB
#70 Accepted 3ms 284.0 KiB
#71 Accepted 3ms 284.0 KiB
#72 Accepted 3ms 284.0 KiB
#73 Accepted 3ms 284.0 KiB
#74 Accepted 3ms 284.0 KiB
#75 Accepted 3ms 284.0 KiB
#76 Accepted 2ms 284.0 KiB
#77 Accepted 2ms 284.0 KiB
#78 Accepted 2ms 284.0 KiB
#79 Accepted 2ms 320.0 KiB
#80 Accepted 3ms 320.0 KiB
#81 Accepted 3ms 284.0 KiB
#82 Accepted 2ms 284.0 KiB
#83 Accepted 2ms 284.0 KiB
#84 Accepted 2ms 324.0 KiB
#85 Accepted 3ms 324.0 KiB
#86 Accepted 3ms 284.0 KiB
#87 Accepted 2ms 284.0 KiB
#88 Accepted 2ms 324.0 KiB
#89 Accepted 2ms 284.0 KiB
#90 Accepted 2ms 284.0 KiB
#91 Accepted 2ms 320.0 KiB
#92 Accepted 3ms 284.0 KiB
#93 Accepted 3ms 284.0 KiB
#94 Accepted 3ms 284.0 KiB
#95 Accepted 1ms 284.0 KiB
#96 Accepted 1ms 284.0 KiB
#97 Accepted 1ms 284.0 KiB
#98 Accepted 2ms 324.0 KiB
#99 Accepted 2ms 284.0 KiB
#100 Accepted 2ms 284.0 KiB

Code

// Author: @Drydock

use std::io::{self, Read};

const INF: i32 = 1000000000;

fn main() {

    solve();

}

fn solve() {

    let mut b = Vec::new();

    io::stdin().read_to_end(&mut b).unwrap();

    let mut g = [b'#'; 121];

    let mut k = 0usize;

    for &c in &b {

        if c == b'#' || c == b'F' || c == b'P' {

            if k < 121 {

                g[k] = c;

                k += 1;

            }

        }

    }

    if k < 121 {

        return;

    }

    let mut ft = vec![INF; 121];

    let mut q = [0usize; 121];

    let mut h = 0usize;

    let mut t = 0usize;

    for i in 0..121 {

        if g[i] == b'F' {

            ft[i] = 0;

            q[t] = i;

            t += 1;

        }

    }

    while h < t {

        let u = q[h];

        h += 1;

        let du = ft[u] + 1;

        let x = u / 11;

        let y = u % 11;

        if x > 0 {

            let v = u - 11;

            if ft[v] > du {

                ft[v] = du;

                q[t] = v;

                t += 1;

            }

        }

        if x + 1 < 11 {

            let v = u + 11;

            if ft[v] > du {

                ft[v] = du;

                q[t] = v;

                t += 1;

            }

        }

        if y > 0 {

            let v = u - 1;

            if ft[v] > du {

                ft[v] = du;

                q[t] = v;

                t += 1;

            }

        }

        if y + 1 < 11 {

            let v = u + 1;

            if ft[v] > du {

                ft[v] = du;

                q[t] = v;

                t += 1;

            }

        }

    }

    let mut p = Vec::new();

    for i in 0..121 {

        if g[i] == b'P' {

            p.push(i);

        }

    }

    let n = p.len();

    if n == 0 {

        print!("0\n");

        return;

    }

    let tm = 512usize;

    let mut mc = vec![vec![i32::MIN; tm + 1]; n];

    let msz = 1usize << n;

    let mut dp = vec![INF; msz];

    dp[0] = 0;

    for m in 0..msz {

        let ct = dp[m];

        if ct >= INF {

            continue;

        }

        let ctu = ct as usize;

        if ctu > tm {

            continue;

        }

        for i in 0..n {

            if (m >> i) & 1 == 0 {

                let mut e = mc[i][ctu];

                if e == i32::MIN {

                    e = esc(p[i], ct, &ft);

                    mc[i][ctu] = e;

                }

                if e < INF {

                    let nm = m | (1usize << i);

                    if dp[nm] > e {

                        dp[nm] = e;

                    }

                }

            }

        }

    }

    let mut an = 0u32;

    for m in 0..msz {

        if dp[m] < INF {

            let c = (m as u32).count_ones();

            if c > an {

                an = c;

            }

        }

    }

    print!("{}\n", an);

}

fn esc(s: usize, t0: i32, ft: &[i32]) -> i32 {

    if ft[s] <= t0 {

        return INF;

    }

    let mut d = [-1i16; 121];

    let mut q = [0usize; 121];

    let mut h = 0usize;

    let mut t = 0usize;

    d[s] = 0;

    q[t] = s;

    t += 1;

    while h < t {

        let u = q[h];

        h += 1;

        let du = d[u] as i32;

        let x = u / 11;

        let y = u % 11;

        if x == 0 || x == 10 || y == 0 || y == 10 {

            return t0 + du + 1;

        }

        let nd = du + 1;

        let at = t0 + nd;

        if x > 0 {

            let v = u - 11;

            if d[v] < 0 && ft[v] > at {

                d[v] = nd as i16;

                q[t] = v;

                t += 1;

            }

        }

        if x + 1 < 11 {

            let v = u + 11;

            if d[v] < 0 && ft[v] > at {

                d[v] = nd as i16;

                q[t] = v;

                t += 1;

            }

        }

        if y > 0 {

            let v = u - 1;

            if d[v] < 0 && ft[v] > at {

                d[v] = nd as i16;

                q[t] = v;

                t += 1;

            }

        }

        if y + 1 < 11 {

            let v = u + 1;

            if d[v] < 0 && ft[v] > at {

                d[v] = nd as i16;

                q[t] = v;

                t += 1;

            }

        }

    }
    INF
}

Information

Submit By
Type
Submission
Problem
P1221 G. Nine-eleven
Contest
Happy New Year 2026
Language
Rust 2021 (Rust 1.75.0)
Submit At
2026-01-06 16:59:27
Judged At
2026-01-06 16:59:27
Judged By
Score
100
Total Time
3ms
Peak Memory
516.0 KiB