Submission #1556176


Source Code Expand

import Data.List
import Data.Maybe
import qualified Data.Array.Base as A
import qualified Data.ByteString.Char8 as B

readInt :: B.ByteString -> Int
readInt = maybe undefined fst . B.readInt

readInts :: B.ByteString -> [Int]
readInts = map readInt . B.words

main = do
  [h,w] <- readInts <$> B.getLine
  css <- map readInts . B.lines <$> B.getContents
  print (chocolate h w css)

chocolate h w css = maximum $ (0 :) $ mapMaybe (balanced mb mw) coors
  where
    coors = [((x1,y1), (x2,y2), (x2-x1+1)*(y2-y1+1)) | x1<-[1..h], y1<-[1..w], x2<-[x1..h], y2<-[y1..w]]
    mb = fromListAccum h w $ zipWith (zipWith (*)) css $ tails $ cycle [0,1] :: Matrix
    mw = fromListAccum h w $ zipWith (zipWith (*)) css $ tails $ cycle [1,0] :: Matrix

balanced mb mw (c1,c2,a)
  | rsum mb c1 c2 == rsum mw c1 c2 = Just a
  | otherwise = Nothing


type Height = Int
type Width = Int
type Index = Int
type Coord = (Height, Width)

-- 1-indexed
data Matrix = M {
  _height :: Int,
  _width :: Int,
  _matrix :: A.UArray Index Int
} deriving (Eq, Show)

(!) :: Matrix -> Coord -> Int
(!) m c = A.unsafeAt (_matrix m) (idx (_width m) c - 1)

idx :: Width -> Coord -> Index
idx w (x, y) = (x - 1) * w + y

fromList :: Height -> Width -> [[Int]] -> Matrix
fromList h w = M h w . A.unsafeArray (1, h*w) . zip [0 ..] . concat

fromListAccum :: Height -> Width -> [[Int]] -> Matrix
fromListAccum h w = fromList h w . csum2

csum1 :: Num a => [a] -> [a]
csum1 = scanl1 (+)

csum2 :: Num a => [[a]] -> [[a]]
csum2 = transpose . map csum1 . transpose . map csum1

rsum :: Matrix -> Coord -> Coord -> Int
rsum m (x1,y1) c2@(x2,y2) = a1 - a2 - a3 + a4
  where
    a1 = m ! c2
    a2 = if x1 == 1 then 0 else m ! (x1-1, y2)
    a3 = if y1 == 1 then 0 else m ! (x2, y1-1)
    a4 = if x1 == 1 || y1 == 1 then 0 else m ! (x1-1, y1-1)

Submission Info

Submission Time
Task B - チョコレート
User aimy
Language Haskell (GHC 7.10.3)
Score 100
Code Size 1868 Byte
Status AC
Exec Time 1246 ms
Memory 6524 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 5
AC × 25
Set Name Test Cases
Sample subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt, subtask0_sample-04.txt, subtask0_sample-05.txt
All subtask0_sample-01.txt, subtask0_sample-02.txt, subtask0_sample-03.txt, subtask0_sample-04.txt, subtask0_sample-05.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_20.txt
Case Name Status Exec Time Memory
subtask0_sample-01.txt AC 1 ms 508 KB
subtask0_sample-02.txt AC 1 ms 380 KB
subtask0_sample-03.txt AC 1 ms 508 KB
subtask0_sample-04.txt AC 1 ms 508 KB
subtask0_sample-05.txt AC 1 ms 508 KB
subtask1_01.txt AC 1 ms 508 KB
subtask1_02.txt AC 1 ms 508 KB
subtask1_03.txt AC 1 ms 508 KB
subtask1_04.txt AC 2 ms 636 KB
subtask1_05.txt AC 2 ms 1020 KB
subtask1_06.txt AC 5 ms 1532 KB
subtask1_07.txt AC 1 ms 636 KB
subtask1_08.txt AC 2 ms 1020 KB
subtask1_09.txt AC 491 ms 5756 KB
subtask1_10.txt AC 78 ms 3324 KB
subtask1_11.txt AC 406 ms 6396 KB
subtask1_12.txt AC 406 ms 6524 KB
subtask1_13.txt AC 406 ms 6524 KB
subtask1_14.txt AC 497 ms 5756 KB
subtask1_15.txt AC 506 ms 5756 KB
subtask1_16.txt AC 390 ms 6268 KB
subtask1_17.txt AC 396 ms 5372 KB
subtask1_18.txt AC 1 ms 508 KB
subtask1_19.txt AC 2 ms 1020 KB
subtask1_20.txt AC 1246 ms 5756 KB