結果

問題 No.801 エレベーター
コンテスト
ユーザー 👑 tttmmmyyyy
提出日時 2026-11-03 16:16:09
言語 Fix
(1.6.0 + cp-library + minilib)
コンパイル:
fix_c _filename_
実行:
./a.out
結果
AC  
実行時間 43 ms / 2,000 ms
+ 398µs
コード長 1,522 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 16,461 ms
コンパイル使用メモリ 667,972 KB
実行使用メモリ 9,868 KB
最終ジャッジ日時 2026-11-03 16:16:30
合計ジャッジ時間 17,744 ms
ジャッジサーバーID
(参考情報)
judge7_0 / judge4_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 27
権限があれば一括ダウンロードができます
コンパイルメッセージ
make: 'lib.o' は更新済みです.

ソースコード

diff #
raw source code

module Main;

import BinaryHeap;
import BoolArray;
import CPLib.Arithmetic;
import CPLib.DSegtree;
import CPLib.Graph;
import CPLib.IO;
import CPLib.LSegtree;
import CPLib.Monoid;
import CPLib.UnionFind;
import CPLib.ZP;
import HashMap;
import HashSet;

type Z = ZP P1000000007;

// type Event = union {
//     enter : (I64, Z),
//     leave : (I64, Z)
// };
// 
// pos : Event -> I64 = |e| match e {
//     enter(i) => i,
//     leave(i) => i
// };

main : IO () = (
    let cN = *read_i; // 回数
    let cM = *read_i; // エレベータの数
    let cK = *read_i; // 移動回数
    let cLRs = *range(0, cM).fold_m([], |_, cLRs|
        let l = *read_i;
        let r = *read_i;
        let l = l - 1;
        cLRs.push_back((l, r)).pure
    );
    let t = Array::fill(cN, zp(0) : Z);
    let t = t[0].iset(zp(1));
    let t = range(0, cK).fold(t, |k, t|
        let acm = range(0, cN).fold([zp(0)], |n, acm|
            let v = acm.@(acm.@size - 1);
            acm.push_back(v + t.@(n))
        );
        let s = Array::fill(cN, zp(0));
        let s = cLRs.to_iter.fold(s, |(l, r), s|
            let sum = acm.@(r) - acm.@(l);
            let s = if 0 <= l && l < s.@size { s[l].imod(add(sum)) } else { s };
            let s = if 0 <= r && r < s.@size { s[r].imod(add(-sum)) } else { s };
            s
        );
        let s = range(1, cN).fold(s, |n, s|
            let v = s[n-1].iget;
            s[n].imod(add(v))
        );
        s
    );
    let ans = t.@(cN-1);
    ans.@value.to_string.println
);
0