結果

問題 No.1855 Intersected Lines
ユーザー MitarushiMitarushi
提出日時 2022-02-17 23:28:13
言語 Nim
(2.0.2)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,881 bytes
コンパイル時間 1,696 ms
コンパイル使用メモリ 76,972 KB
最終ジャッジ日時 2024-11-20 19:37:36
合計ジャッジ時間 3,774 ms
ジャッジサーバーID
(参考情報)
judge4 / 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

echo ans
0