結果

問題 No.1855 Intersected Lines
ユーザー MitarushiMitarushi
提出日時 2022-02-24 23:27:55
言語 Nim
(2.0.2)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,015 bytes
コンパイル時間 776 ms
コンパイル使用メモリ 76,508 KB
最終ジャッジ日時 2024-04-27 13:07:01
合計ジャッジ時間 2,671 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
/home/judge/data/code/Main.nim(4, 30) Error: type mismatch: got 'seq[int]' for 'map(split(readLine(stdin), {' ', '\t', '\v', '\r', '\n', '\f'}, -1), parseInt)' but expected 'tuple'

ソースコード

diff #

import strutils, sequtils, sugar, times

var n, x: int64
(n, x) = stdin.readLine.split.map(parseInt)

assert 1 <= n and n <= 499122176
assert 1 <= x and x <= 400000

const MOD = 998244353i64

var cv = newSeq[(char, int64)](x)
for i in 0..<x:
    var temp: seq[string] = stdin.readLine.split
    cv[i] = (temp[0][0], parseBiggestInt(temp[1]))

    assert cv[i][0] == 'R' or cv[i][0] == 'B'
    assert 1 <= cv[i][1] and cv[i][1] <= 2 * n

var
    b_sum = cv.mapIt(
    if it[0] == 'B':
        it[1]
    else:
        0
    ).foldl(a + b)
    r_sum = cv.mapIt(
    if it[0] == 'R':
        it[1]
    else:
        0
    ).foldl(a + b)

assert b_sum + r_sum == 2 * n
assert b_sum mod 2 == 0 and r_sum mod 2 == 0

proc cross(): int64 =
    var
        sum_1 = 0i64
        sum_2 = 0i64
        sum_3 = 0i64
        b = 0i64
        ans = 0i64

    for (c, v) in cv:
        if c == 'B':
            b += v
        else:
            ans += sum_1 * (b_sum * b mod MOD - b * b mod MOD) mod MOD * v
            ans += sum_2 * (-b_sum + 2 * b) mod MOD * v
            ans -= sum_3 * v
            ans = ans mod MOD

            sum_1 += v
            sum_1 = sum_1 mod MOD
            sum_2 += v * b
            sum_2 = sum_2 mod MOD
            sum_3 += v * b mod MOD * b
            sum_3 = sum_3 mod MOD

    ans

proc inv(a: int64): int64 =
    var
        x = 1i64
        z = a
    while abs(z) > 1:
        let q = (MOD + (abs(z) shr 1)) div z
        z = MOD - q * z
        x = -x * q mod MOD
    if z < 0:
        x = -x
    if x < 0:
        x = x + MOD
    x

var ans = 0i64

if r_sum > 0:
    let n = r_sum div 2
    ans += n * (n - 1) mod MOD * inv(6)

if b_sum > 0:
    let n = b_sum div 2
    ans += n * (n - 1) mod MOD * inv(6)

if r_sum > 0 and b_sum > 0:
    ans += cross() * inv((r_sum - 1) * (b_sum - 1) mod MOD)

ans = ans mod MOD
if ans < 0:
    ans += MOD

proc last_check() =
    try:
        let x = stdin.readLine
        assert x == ""
    except EOFError:
        return

echo ans

last_check()
0