結果
| 問題 |
No.1855 Intersected Lines
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-02-24 23:27:55 |
| 言語 | Nim (2.2.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,015 bytes |
| コンパイル時間 | 1,293 ms |
| コンパイル使用メモリ | 75,136 KB |
| 最終ジャッジ日時 | 2024-11-15 15:15:18 |
| 合計ジャッジ時間 | 3,320 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、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'
ソースコード
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()