結果

問題 No.3680 セグメント釣り
コンテスト
ユーザー ぱるま
提出日時 2026-09-05 14:26:11
言語 Rust
(1.97.1 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
AC  
実行時間 102 ms / 2,000 ms
+ 679µs
コード長 2,681 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 8,229 ms
コンパイル使用メモリ 187,068 KB
実行使用メモリ 9,764 KB
最終ジャッジ日時 2026-09-05 14:26:40
合計ジャッジ時間 6,331 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge7_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 13
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: unused import: `min`
  --> src/main.rs:48:21
   |
48 | use std::cmp::{max, min};
   |                     ^^^
   |
   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

ソースコード

diff #
raw source code

// 問題文と制約は読みましたか?
// #[fastout]

// (sx, sy) → (dx, dy) のコスト
fn solve(sx: i64, sy: i64, dx: i64, dy: i64) -> i64 {
    if sy >= 62 && dy >= 62 {
        return (sy - dy).abs();
    }
    if sy >= 62 {
        return solve(sx, 61, dx, dy) + (sy - 61); // 61 まで降りる
    }
    if dy >= 62 {
        return solve(sx, sy, dx, 61) + (dy - 61); // 61 まで降りる
    }

    assert!(sy <= 61);
    assert!(dy <= 61);
    (max(sy, dy)..62)
        .map(|cy| {
            let sx2 = sx >> cy;
            let dx2 = dx >> cy;

            (sx2- dx2).abs() // 横移動
            + cy - sy // 上移動
            + cy - dy // 上移動
        })
        .min()
        .unwrap()
}
fn main() {
    input! {
        t: usize
    }

    for _ in 0..t {
        input! {
            sx: i64,
            sy: i64,
            dx: i64,
            dy: i64,
        }
        let ans = solve(sx, sy, dx, dy);
        println!("{}", ans);
    }
}

// ====== import ======
use std::cmp::{max, min};
#[allow(unused_imports)]
use {
    itertools::{Itertools, chain, iproduct, izip},
    proconio::{
        derive_readable, fastout, input,
        marker::{Bytes, Chars, Usize1},
    },
    std::{
        cmp::Reverse,
        collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet},
    },
};

// ====== output func ======
#[allow(unused_imports)]
use print_util::*;
pub mod print_util {
    use itertools::Itertools;
    use proconio::fastout;

    #[fastout]
    pub fn print_vec<T: std::fmt::Display>(arr: &[T]) {
        for a in arr {
            println!("{}", a);
        }
    }

    #[fastout]
    pub fn print_vec_1line<T: std::fmt::Display>(arr: &[T]) {
        println!("{}", arr.iter().join(" "));
    }

    #[fastout]
    pub fn print_vec2<T: std::fmt::Display, R: AsRef<[T]>>(arr: &[R]) {
        for row in arr {
            println!("{}", row.as_ref().iter().join(" "));
        }
    }

    pub fn print_bytes(bytes: &[u8]) {
        println!("{}", std::str::from_utf8(bytes).unwrap());
    }

    pub fn print_chars(chars: &[char]) {
        println!("{}", chars.iter().collect::<String>());
    }

    #[fastout]
    pub fn print_vec_bytes<R: AsRef<[u8]>>(vec_bytes: &[R]) {
        for row in vec_bytes {
            println!("{}", std::str::from_utf8(row.as_ref()).unwrap());
        }
    }

    #[fastout]
    pub fn print_vec_chars<R: AsRef<[char]>>(vec_chars: &[R]) {
        for row in vec_chars {
            println!("{}", row.as_ref().iter().collect::<String>());
        }
    }

    pub fn print_yesno(ans: bool) {
        println!("{}", if ans { "Yes" } else { "No" });
    }
}

// ====== snippet ======
0