結果
| 問題 |
No.346 チワワ数え上げ問題
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-08-03 23:51:21 |
| 言語 | Haskell (9.10.1) |
| 結果 |
AC
|
| 実行時間 | 415 ms / 2,000 ms |
| コード長 | 1,419 bytes |
| コンパイル時間 | 3,668 ms |
| コンパイル使用メモリ | 167,808 KB |
| 実行使用メモリ | 86,656 KB |
| 最終ジャッジ日時 | 2024-11-06 23:46:11 |
| 合計ジャッジ時間 | 5,825 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.8.2/environments/default [1 of 2] Compiling Main ( Main.hs, Main.o ) [2 of 2] Linking a.out
ソースコード
data Tree = NilNode | Node Integer Tree Tree
segWidth = 2 ^ 17
segVal NilNode = 0
segVal (Node val _ _) = val
segUpdate = f 0 segWidth
where
f l r k v NilNode = f l r k v (Node 0 NilNode NilNode)
f l r k v (Node val left right)
| r - l == 1 = Node (val + v) NilNode NilNode
| otherwise =
let mid = (l + r) `quot` 2 in
if k < mid then
let newLeft = f l mid k v left in
Node (segVal newLeft + segVal right) newLeft right
else
let newRight = f mid r k v right in
Node (segVal left + segVal newRight) left newRight
segQuery = f 0 segWidth
where
n = 2 ^ 17
f l r a b NilNode = 0
f l r a b (Node val left right)
| r <= a || b <= l = 0
| a <= l && r <= b = val
| otherwise =
let mid = (l + r) `quot` 2
vl = f l mid a b left
vr = f mid r a b right in vl + vr
main = getLine >>= print . solve
solve = fst . foldr f (0, NilNode) . flip zip [0..]
where
f (v, i) (s, tree)
| v == 'c' = let num = segQuery (i + 1) segWidth tree in (s + num * (num - 1) `quot` 2, tree)
| v == 'w' = (s, segUpdate i 1 tree)
| otherwise = (s, tree)