結果

問題 No.1170 Never Want to Walk
コンテスト
ユーザー tttmmmyyyy
提出日時 2026-10-26 21:56:46
言語 Fix
(1.6.0 + cp-library + minilib)
コンパイル:
fix_c _filename_
実行:
./a.out
結果
AC  
実行時間 80 ms / 2,000 ms
+ 965µs
コード長 1,058 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 15,556 ms
コンパイル使用メモリ 670,184 KB
実行使用メモリ 9,920 KB
最終ジャッジ日時 2026-10-26 21:57:13
合計ジャッジ時間 17,897 ms
ジャッジサーバーID
(参考情報)
judge7_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 38
権限があれば一括ダウンロードができます
コンパイルメッセージ
make: 'lib.o' は更新済みです.

ソースコード

diff #
raw source code

module Main;

import CPLib.IO;
import CPLib.UnionFind::{create, get_group_size, unite, UnionFind};

main : IO () = (
    let (n, a, b) = (*read_i, *read_i, *read_i);
    let xs = *read_is(n);
    let uf = UnionFind::create(n);
    let (uf, _, _) = range(0, n).fold((uf, 0, 0), |i, (uf, begin, end)|
        let begin1 = loop(begin, |begin|
            if begin >= n { n.break };
            if xs.@(i) + a <= xs.@(begin) { begin.break };
            (begin+1).continue
        );
        let end1 = loop(end, |end|
            if end >= n { n.break };
            if xs.@(i) + b < xs.@(end) { end.break };
            (end+1).continue
        );
        let uf = if i == 0 || begin1 >= end {
            range_step(begin1, end1, 1).fold(uf, |j, uf| uf.unite(i, j))
        } else {
            range_step(end-1, end1, 1).fold(uf, |j, uf| uf.unite(i, j))
        };
        (uf, begin1, end1)
    );
    let uf = *range(0, n).fold_m(uf, |i, ufe|
       let (uf, grps) = uf.get_group_size(i);
       grps.to_string.println;;
       uf.pure
    );
    pure()
);
0