結果

問題 No.2716 Falcon Method
ユーザー atcoder8atcoder8
提出日時 2024-04-05 23:06:19
言語 Rust
(1.77.0)
結果
AC  
実行時間 291 ms / 2,000 ms
コード長 2,713 bytes
コンパイル時間 1,714 ms
コンパイル使用メモリ 183,448 KB
実行使用メモリ 8,192 KB
最終ジャッジ日時 2024-04-05 23:06:30
合計ジャッジ時間 7,228 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,676 KB
testcase_01 AC 1 ms
6,676 KB
testcase_02 AC 1 ms
6,676 KB
testcase_03 AC 1 ms
6,676 KB
testcase_04 AC 1 ms
6,676 KB
testcase_05 AC 1 ms
6,676 KB
testcase_06 AC 3 ms
6,676 KB
testcase_07 AC 1 ms
6,676 KB
testcase_08 AC 3 ms
6,676 KB
testcase_09 AC 2 ms
6,676 KB
testcase_10 AC 2 ms
6,676 KB
testcase_11 AC 260 ms
7,808 KB
testcase_12 AC 191 ms
7,296 KB
testcase_13 AC 149 ms
6,940 KB
testcase_14 AC 217 ms
7,040 KB
testcase_15 AC 160 ms
6,928 KB
testcase_16 AC 199 ms
6,704 KB
testcase_17 AC 227 ms
7,168 KB
testcase_18 AC 286 ms
7,680 KB
testcase_19 AC 197 ms
6,676 KB
testcase_20 AC 168 ms
6,824 KB
testcase_21 AC 213 ms
6,912 KB
testcase_22 AC 278 ms
8,192 KB
testcase_23 AC 288 ms
8,192 KB
testcase_24 AC 291 ms
8,192 KB
testcase_25 AC 0 ms
6,676 KB
testcase_26 AC 1 ms
6,676 KB
testcase_27 AC 264 ms
8,192 KB
testcase_28 AC 262 ms
8,192 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