結果

問題 No.2716 Falcon Method
ユーザー atcoder8atcoder8
提出日時 2024-04-05 23:06:19
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 249 ms / 2,000 ms
コード長 2,713 bytes
コンパイル時間 14,399 ms
コンパイル使用メモリ 393,772 KB
実行使用メモリ 8,304 KB
最終ジャッジ日時 2024-10-01 03:01:43
合計ジャッジ時間 17,301 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,820 KB
testcase_01 AC 1 ms
6,820 KB
testcase_02 AC 1 ms
6,816 KB
testcase_03 AC 1 ms
6,816 KB
testcase_04 AC 1 ms
6,816 KB
testcase_05 AC 1 ms
6,820 KB
testcase_06 AC 2 ms
6,820 KB
testcase_07 AC 3 ms
6,816 KB
testcase_08 AC 2 ms
6,820 KB
testcase_09 AC 2 ms
6,820 KB
testcase_10 AC 2 ms
6,816 KB
testcase_11 AC 223 ms
7,800 KB
testcase_12 AC 165 ms
7,204 KB
testcase_13 AC 135 ms
7,040 KB
testcase_14 AC 214 ms
7,040 KB
testcase_15 AC 145 ms
6,912 KB
testcase_16 AC 183 ms
6,820 KB
testcase_17 AC 216 ms
7,296 KB
testcase_18 AC 249 ms
7,808 KB
testcase_19 AC 174 ms
6,816 KB
testcase_20 AC 139 ms
6,820 KB
testcase_21 AC 186 ms
6,912 KB
testcase_22 AC 247 ms
8,304 KB
testcase_23 AC 237 ms
8,188 KB
testcase_24 AC 229 ms
8,192 KB
testcase_25 AC 1 ms
6,816 KB
testcase_26 AC 1 ms
6,816 KB
testcase_27 AC 232 ms
8,064 KB
testcase_28 AC 225 ms
8,252 KB
権限があれば一括ダウンロードができます

ソースコード

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 calc_sum_progress = |start: usize, mut move_num: usize| {
        let mut sum_progress = (0, 0);

        if start + move_num <= n {
            return calc_progress(start, start + move_num);
        }

        let progress1 = calc_progress(start, n);
        sum_progress.0 += progress1.0;
        sum_progress.1 += progress1.1;
        move_num -= n - start;

        let cycle_num = move_num / n;
        let progress2 = calc_progress(0, n);
        sum_progress.0 += progress2.0 * cycle_num;
        sum_progress.1 += progress2.1 * cycle_num;
        move_num -= cycle_num * n;

        let progress3 = calc_progress(0, move_num);
        sum_progress.0 += progress3.0;
        sum_progress.1 += progress3.1;

        sum_progress
    };

    let solve = |h: usize, w: usize, p: usize| {
        let mut ok = n * h.max(w);
        let mut ng = 0_usize;
        while ok.abs_diff(ng) > 1 {
            let mid = (ok + ng) / 2;

            let sum_progress = calc_sum_progress(p, mid);

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

        (p + ok) % n
    };

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