結果

問題 No.2716 Falcon Method
ユーザー atcoder8atcoder8
提出日時 2024-04-05 22:18:00
言語 Rust
(1.77.0 + proconio)
結果
RE  
実行時間 -
コード長 2,851 bytes
コンパイル時間 11,873 ms
コンパイル使用メモリ 379,196 KB
実行使用メモリ 8,320 KB
最終ジャッジ日時 2024-10-01 02:32:09
合計ジャッジ時間 15,043 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 RE -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 RE -
testcase_06 RE -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 RE -
testcase_11 RE -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 RE -
testcase_22 RE -
testcase_23 WA -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
testcase_27 WA -
testcase_28 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

fn main() {
    let (n, q) = {
        let mut line = String::new();
        std::io::stdin().read_line(&mut line).unwrap();
        let mut iter = line.split_whitespace();
        (
            iter.next().unwrap().parse::<usize>().unwrap(),
            iter.next().unwrap().parse::<usize>().unwrap(),
        )
    };
    let s: Vec<char> = {
        let mut line = String::new();
        std::io::stdin().read_line(&mut line).unwrap();
        line.trim().chars().collect()
    };
    let hwp: Vec<_> = (0..q)
        .map(|_| {
            let mut line = String::new();
            std::io::stdin().read_line(&mut line).unwrap();
            let mut iter = line.split_whitespace();
            (
                iter.next().unwrap().parse::<usize>().unwrap(),
                iter.next().unwrap().parse::<usize>().unwrap(),
                iter.next().unwrap().parse::<usize>().unwrap(),
            )
        })
        .collect();

    // 文字列Sの通りに進んだときの累積距離
    let mut prefix_sum = vec![(0, 0); n + 1];
    for (i, &c) in s.iter().enumerate() {
        prefix_sum[i + 1] = prefix_sum[i];
        if c == 'D' {
            prefix_sum[i + 1].0 += 1;
        } else {
            prefix_sum[i + 1].1 += 1;
        }
    }

    let calc_progress = |left: usize, right: usize| {
        (
            prefix_sum[right].0 - prefix_sum[left].0,
            prefix_sum[right].1 - prefix_sum[left].1,
        )
    };

    let solve = |mut h: usize, mut w: usize, p: usize| {
        let progress_from_p_to_n = calc_progress(p, n);

        // 文字列の終端までにグリッドの端に辿り着く場合
        if progress_from_p_to_n.0 >= h || progress_from_p_to_n.1 >= w {
            let mut ok = n;
            let mut ng = p;
            while ok.abs_diff(ng) > 1 {
                let mid = (ok + ng) / 2;

                let progress = calc_progress(p, mid);

                if progress.0 >= h || progress.1 >= w {
                    ok = mid;
                } else {
                    ng = mid;
                }
            }

            return ok % n;
        }

        h -= progress_from_p_to_n.0;
        w -= progress_from_p_to_n.1;

        let progress_from_0_to_n = calc_progress(0, n);

        let rem_h = h % progress_from_0_to_n.0;
        let rem_w = w % progress_from_0_to_n.1;

        if rem_h == 0 || rem_w == 0 {
            return 0;
        }

        let mut ok = n;
        let mut ng = 0;
        while ok.abs_diff(ng) > 1 {
            let mid = (ok + ng) / 2;

            let progress = calc_progress(0, mid);

            if progress.0 >= h || progress.1 >= w {
                ok = mid;
            } else {
                ng = mid;
            }
        }

        return ok % n;
    };

    for &(h, w, p) in &hwp {
        println!("{}", solve(h, w, p));
    }
}
0