1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import Data.List import Data.Array import Data.Maybe import qualified Data.ByteString.Lazy.Char8 as BS import Text.Printf --monotone data Point a = P a a deriving ( Show , Ord , Eq ) data Turn = RS | L deriving ( Show , Ord , Eq , Enum ) calAngle :: ( Num a , Ord a , Eq a ) => Point a -> Point a -> Point a -> Ordering calAngle ( P x0 y0 ) ( P x1 y1 ) ( P x2 y2 ) = compare ( ( y1 - y0 ) * ( x2 - x0 ) ) ( ( y2 - y0 ) * ( x1 - x0 ) ) sortByangle :: ( Num a , Ord a , Eq a ) => [ Point a ] -> [ Point a ] sortByangle ( x : xs ) = x : sortBy (\ p1 p2 -> calAngle x p1 p2 ) xs findTurn :: ( Num a , Ord a , Eq a ) => Point a -> Point a -> Point a -> Turn findTurn ( P x0 y0 ) ( P x1 y1 ) ( P x2 y2 ) = case compare ( ( y1 - y0 ) * ( x2 - x0 ) ) ( ( y2 - y0 ) * ( x1 - x0 ) ) of LT -> L _ -> RS computeHull :: ( Num a , Ord a , Eq a ) => [ Point a ] -> [ Point a ] -> [ Point a ] computeHull [ x ] ( z : ys ) = computeHull [ z , x ] ys computeHull ys [] = reverse ys computeHull u@( y : x : xs ) t@( z : ys ) | findTurn x y z == RS = computeHull ( x : xs ) t | otherwise = computeHull ( z : u ) ys convexHull :: ( Num a , Ord a , Eq a ) => [ Point a ] -> [ Point a ] convexHull xs = final where t1@( x1 : y1 : xs1) = sort xs lhull = computeHull [ y1 , x1 ] xs1 t2@( x2 : y2 : xs2 ) = reverse t1 uhull = computeHull [ y2 , x2 ] xs2 final = nub $ lhull ++ uhull --end of monotone caltmp :: ( Num a , Ord a , Floating a ) => Int -> Int -> Int -> Array Int ( Point a ) -> a caltmp a b c arr = area where P x1 y1 = arr ! a P x2 y2 = arr ! b P x3 y3 = arr ! c area = 0.5 * ( abs $ ( x1 * y2 + x2 * y3 + x3 * y1 ) - ( y1 * x2 + y2 * x3 + y3 * x1 ) ) calArea :: ( Num a , Ord a , Floating a ) => Int -> Int -> Int -> Int -> a -> Array Int ( Point a ) -> ( Int , Int , Int , a ) calArea a b c n area arr | area' >= area = calArea a b ( mod ( c + 1 ) n ) n area' arr --area a b ( c + 1 ) is greater than area a b c | area'' >= area = calArea a ( mod ( b + 1 ) n ) c n area'' arr --check if area a ( b + 1 ) c is greater area a b c | otherwise = ( a , b , c , area ) where area' = caltmp a b ( mod ( c + 1 ) n ) arr area'' = caltmp a ( mod ( b + 1 ) n ) c arr looPing :: ( Num a , Ord a , Eq a , Floating a ) => Int -> Int -> Int -> Int -> a -> Array Int ( Point a ) -> a looPing a b c n area arr | a == n = area | otherwise = looPing a'' b'' c'' n area' arr where ( a' , b' , c' , area' ) = calArea a b c n area arr a'' = a' + 1 b'' = if a'' == b' then mod ( b' + 1 ) n else b' c'' = if b'' == c' then mod ( c' + 1 ) n else c' solve :: ( Num a , Ord a , Floating a ) => [ Point a ] -> a solve [] = 0 solve [ p ] = 0 solve [ p1 , p2 ] = 0 solve arr = looPing 0 1 2 n area arr' where n = length arr arr' = listArray ( 0 , pred n ) arr area = caltmp 0 1 2 arr' final :: ( Num a , Ord a , RealFloat a ) => [ Point a ] -> a final [] = 0 final [ p ] = 0 final [ p1 , p2 ] = 0 final arr = solve . convexHull $ arr format :: ( Num a , Ord a , Floating a ) => [ Int ] -> [ [ Point a ]] format [] = [] format (x:xs ) = t : format b where ( a , b ) = splitAt ( 2 * x ) xs t = helpFormat a where helpFormat [] = [] helpFormat ( x' : y' : xs' ) = P ( fromIntegral x' ) ( fromIntegral y' ) : helpFormat xs' readD :: BS.ByteString -> Int readD = fst . fromJust . BS.readInt main = BS.interact $ BS.unlines . map ( BS.pack . ( printf "%.2f" :: Double -> String ) . final ) . format . concat . map ( map readD . BS.words ) . init . BS.lines --main = interact $ unlines . map ( show . convexHull ) . format . concat . map ( map read . words ) . init . lines |
aW1wb3J0IERhdGEuTGlzdAppbXBvcnQgRGF0YS5BcnJheQppbXBvcnQgRGF0YS5NYXliZQppbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEJTCmltcG9ydCBUZXh0LlByaW50ZgoKCi0tbW9ub3RvbmUKCmRhdGEgUG9pbnQgYSA9IFAgYSBhIGRlcml2aW5nICggU2hvdyAsIE9yZCAsIEVxICkgCmRhdGEgVHVybiA9IFJTIHwgTCBkZXJpdmluZyAoIFNob3cgLCBPcmQgICwgRXEgLCBFbnVtICkgCgpjYWxBbmdsZSA6OiAoIE51bSBhICwgT3JkIGEgLCBFcSBhICkgPT4gUG9pbnQgYSAtPiBQb2ludCBhIC0+IFBvaW50IGEgLT4gT3JkZXJpbmcKY2FsQW5nbGUgKCBQIHgwIHkwICkgKCBQIHgxIHkxICkgKCBQIHgyIHkyICkgPSBjb21wYXJlICggKCB5MSAtIHkwICkgKiAoIHgyIC0geDAgKSApICggKCB5MiAtIHkwICkgKiAoIHgxIC0geDAgKSApCgoKc29ydEJ5YW5nbGUgOjogKCBOdW0gYSAsIE9yZCBhICwgRXEgYSApID0+IFsgUG9pbnQgYSBdIC0+IFsgUG9pbnQgYSBdCnNvcnRCeWFuZ2xlICggeCA6IHhzICkgPSB4IDogc29ydEJ5IChcIHAxIHAyIC0+IGNhbEFuZ2xlIHggcDEgcDIgKSB4cyAKCmZpbmRUdXJuIDo6ICggTnVtIGEgLCBPcmQgYSAsIEVxIGEgKSA9PiBQb2ludCBhIC0+IFBvaW50IGEgLT4gUG9pbnQgYSAtPiBUdXJuCmZpbmRUdXJuICggUCB4MCB5MCApICggUCB4MSB5MSApICggUCB4MiB5MiApID0gCiAgIGNhc2UgY29tcGFyZSAoICggeTEgLSB5MCApICogKCB4MiAtIHgwICkgKSAoICggeTIgLSB5MCApICogKCB4MSAtIHgwICkgKSBvZiAKCSAgICBMVCAtPiBMIAoJICAgIF8gIC0+IFJTIAoKCmNvbXB1dGVIdWxsIDo6ICggTnVtIGEgLCBPcmQgYSAsIEVxIGEgKSA9PiBbIFBvaW50IGEgXSAtPiBbIFBvaW50IGEgXSAtPiBbIFBvaW50IGEgXSAKY29tcHV0ZUh1bGwgWyB4IF0gKCB6IDogeXMgKSA9IGNvbXB1dGVIdWxsIFsgeiAsIHggXSB5cyAKY29tcHV0ZUh1bGwgeXMgW10gPSByZXZlcnNlIHlzIApjb21wdXRlSHVsbCB1QCggeSA6IHggOiB4cyApIHRAKCB6IDogeXMgKSAgCiAgfCBmaW5kVHVybiB4IHkgeiA9PSBSUyA9IGNvbXB1dGVIdWxsICggeCA6IHhzICkgdCAKICB8IG90aGVyd2lzZSAgPSBjb21wdXRlSHVsbCAoIHogOiB1ICkgeXMgCgoKY29udmV4SHVsbCA6OiAoIE51bSBhICwgT3JkIGEgLCBFcSBhICkgPT4gWyBQb2ludCBhIF0gLT4gWyBQb2ludCBhIF0KY29udmV4SHVsbCB4cyA9IGZpbmFsICAgd2hlcmUgCgl0MUAoIHgxIDogeTEgOiB4czEpICA9IHNvcnQgeHMgCglsaHVsbCA9IGNvbXB1dGVIdWxsIFsgeTEgLCB4MSBdIHhzMSAKCXQyQCggeDIgOiB5MiA6IHhzMiApID0gcmV2ZXJzZSB0MSAKCXVodWxsID0gY29tcHV0ZUh1bGwgWyB5MiAsIHgyIF0geHMyIAoJZmluYWwgPSAgbnViICQgIGxodWxsICsrICB1aHVsbAoJCgoKLS1lbmQgb2YgbW9ub3RvbmUKCgpjYWx0bXAgOjogKCBOdW0gYSAsIE9yZCBhICwgRmxvYXRpbmcgYSApID0+IEludCAtPiBJbnQgLT4gSW50IC0+IEFycmF5IEludCAoIFBvaW50IGEgKSAtPiBhIApjYWx0bXAgYSBiIGMgYXJyID0gYXJlYSB3aGVyZSAKCVAgeDEgeTEgPSBhcnIgISBhIAoJUCB4MiB5MiA9IGFyciAhIGIgCglQIHgzIHkzID0gYXJyICEgYyAKCWFyZWEgPSAwLjUgKiAoIGFicyAkICggeDEgKiB5MiArIHgyICogeTMgKyB4MyAqIHkxICkgIC0gICggeTEgKiB4MiArIHkyICogeDMgKyB5MyAqIHgxICkgKQoJIAoKY2FsQXJlYSA6OiAoIE51bSBhICwgT3JkIGEgLCBGbG9hdGluZyBhICkgPT4gSW50IC0+IEludCAtPiBJbnQgIC0+IEludCAgLT4gYSAtPiBBcnJheSBJbnQgKCBQb2ludCBhICkgLT4gKCBJbnQgLCBJbnQgLCBJbnQgLCBhICkgCmNhbEFyZWEgYSBiIGMgIG4gYXJlYSBhcnIKIHwgYXJlYScgPj0gYXJlYSA9IGNhbEFyZWEgYSBiICggbW9kICggYyArIDEgKSBuICkgICBuIGFyZWEnIGFyciAgICAgIC0tYXJlYSBhIGIgICggYyArIDEgKSAgaXMgZ3JlYXRlciB0aGFuIGFyZWEgYSBiIGMKIHwgYXJlYScnID49ICBhcmVhICA9IGNhbEFyZWEgYSAoIG1vZCAoIGIgKyAxICkgbiApICBjICBuIGFyZWEnJyBhcnIgICAtLWNoZWNrIGlmIGFyZWEgYSAoIGIgKyAxICkgYyBpcyBncmVhdGVyIGFyZWEgYSBiIGMgCiB8IG90aGVyd2lzZSA9ICAoIGEgLCBiICwgYyAsIGFyZWEgKSAKCXdoZXJlIAoJIGFyZWEnID0gY2FsdG1wIGEgYiAoIG1vZCAoIGMgKyAxICkgbiApIGFycgoJIGFyZWEnJyA9IGNhbHRtcCBhICggbW9kICggYiArIDEgKSBuICkgYyBhcnIgCgkJICAgIApsb29QaW5nIDo6ICggTnVtIGEgLCBPcmQgYSAsIEVxIGEgLCBGbG9hdGluZyBhICkgPT4gSW50IC0+IEludCAtPiBJbnQgLT4gSW50IC0+IGEgLT4gQXJyYXkgSW50ICggUG9pbnQgYSApIC0+IGEgCmxvb1BpbmcgYSBiIGMgbiBhcmVhIGFyciAgCiB8IGEgPT0gbiA9IGFyZWEgCiB8IG90aGVyd2lzZSA9IGxvb1BpbmcgYScnIGInJyBjJycgbiBhcmVhJyBhcnIgd2hlcmUgCgkoIGEnICwgYicgLCBjJyAsIGFyZWEnICkgPSBjYWxBcmVhIGEgYiBjIG4gYXJlYSBhcnIgCglhJycgPSBhJyArIDEgCgliJycgPSBpZiBhJycgPT0gYicgdGhlbiBtb2QgKCBiJyArIDEgKSBuIGVsc2UgYicKCWMnJyA9IGlmIGInJyA9PSBjJyB0aGVuIG1vZCAoIGMnICsgMSApIG4gZWxzZSBjJwogCgpzb2x2ZSA6OiAoIE51bSBhICwgT3JkIGEgLCBGbG9hdGluZyBhICkgPT4gWyBQb2ludCBhIF0gLT4gIGEgCnNvbHZlIFtdID0gMApzb2x2ZSBbIHAgXSA9IDAKc29sdmUgWyBwMSAsIHAyIF0gPSAwCnNvbHZlIGFyciA9ICAKCWxvb1BpbmcgMCAxIDIgIG4gYXJlYSBhcnInIHdoZXJlIAoJbiA9IGxlbmd0aCBhcnIgCglhcnInID0gbGlzdEFycmF5ICggMCAsIHByZWQgbiApIGFycgogICAgICAgIGFyZWEgPSBjYWx0bXAgMCAxIDIgYXJyJwkKCiAKZmluYWwgOjogKCBOdW0gYSAsIE9yZCBhICwgUmVhbEZsb2F0IGEgKSA9PiBbIFBvaW50IGEgXSAtPiBhCmZpbmFsIFtdID0gMApmaW5hbCBbIHAgXSA9ICAwIApmaW5hbCBbIHAxICwgcDIgXSA9ICAwIApmaW5hbCBhcnIgPSBzb2x2ZSAuIGNvbnZleEh1bGwgJCBhcnIgCgoKZm9ybWF0IDo6ICggTnVtIGEgLCBPcmQgYSAsIEZsb2F0aW5nIGEgKSA9PiBbIEludCBdIC0+IFsgWyBQb2ludCBhIF1dCmZvcm1hdCBbXSA9IFtdCmZvcm1hdCAoeDp4cyApID0gIHQgOiBmb3JtYXQgYiAgd2hlcmUKICAgICAgICAoIGEgLCBiICkgPSBzcGxpdEF0ICggMiAqIHggKSB4cwogICAgICAgIHQgPSBoZWxwRm9ybWF0IGEgd2hlcmUKICAgICAgICAgICAgaGVscEZvcm1hdCBbXSA9IFtdCiAgICAgICAgICAgIGhlbHBGb3JtYXQgKCB4JyA6IHknIDogeHMnICkgPSAgUCAoIGZyb21JbnRlZ3JhbCB4JyApICggZnJvbUludGVncmFsICB5JyApICA6IGhlbHBGb3JtYXQgeHMnCiAKcmVhZEQgOjogQlMuQnl0ZVN0cmluZyAtPiBJbnQKcmVhZEQgPSBmc3QgLiBmcm9tSnVzdCAuIEJTLnJlYWRJbnQKIAptYWluID0gQlMuaW50ZXJhY3QgJCBCUy51bmxpbmVzIC4gbWFwICggQlMucGFjayAuICggcHJpbnRmICIlLjJmIiA6OiBEb3VibGUgLT4gU3RyaW5nICkgLiBmaW5hbCApIC4gZm9ybWF0IC4gY29uY2F0IC4gbWFwICAoIG1hcCAgcmVhZEQgLiBCUy53b3JkcyApIC4gaW5pdCAgLiBCUy5saW5lcyAgCgoKLS1tYWluID0gaW50ZXJhY3QgJCB1bmxpbmVzIC4gbWFwICggc2hvdyAuIGNvbnZleEh1bGwgKSAuIGZvcm1hdCAuIGNvbmNhdCAuIG1hcCAoIG1hcCByZWFkIC4gd29yZHMgKSAuIGluaXQgLiBsaW5lcyA=
[1 of 1] Compiling Main ( prog.hs, prog.o ) Linking prog ...
-
upload with new input
-
result: Success time: 0s memory: 3808 kB returned value: 0
20 886 9383 6915 2777 8335 7793 492 5386 1421 6649 27 2362 59 8690 3926 7763 3426 540 5736 9172 5368 5211 6429 2567 1530 5782 5123 2862 3135 4067 9802 3929 3058 4022 8167 3069 8456 1393 8042 5011 -1
31466755.50
-
result: Success time: 0s memory: 3808 kB returned value: 0
20 886 9383 6915 2777 8335 7793 492 5386 1421 6649 27 2362 59 8690 3926 7763 3426 540 5736 9172 5368 5211 6429 2567 1530 5782 5123 2862 3135 4067 9802 3929 3058 4022 8167 3069 8456 1393 8042 5011 20 7373 6229 4919 4421 8537 3784 4324 5198 4370 8315 3526 6413 8980 6091 1873 9956 9170 6862 7281 6996 925 2305 6327 7084 6505 336 1729 846 5857 1313 3895 6124 545 9582 3367 8814 364 5434 3750 4043 20 6808 1087 7178 7276 3584 5788 2651 5403 2399 2754 5060 9932 3368 9676 12 7739 8586 6226 7539 8094 570 795 378 1434 6601 7467 2902 97 492 3317 756 6652 280 7301 9441 4286 9689 3865 6619 8444 20 4729 8440 8117 8031 5771 8097 675 4481 8927 709 7856 4567 2353 9497 6965 4586 4683 5306 8624 6219 2871 1528 8829 5732 19 9503 3368 8270 6715 9708 8149 6340 723 7796 2245 2618 3451 2846 3555 2921 20 7488 2379 8228 7764 2350 9841 1500 5193 7764 7034 4914 124 5856 6987 6491 3743 8365 2227 1936 9859 2551 1432 9228 6437 5407 3275 6121 1474 4395 8858 1237 6029 3793 8235 4428 5818 1011 6143 9529 5928 20 2404 8776 5763 4443 4538 4613 6840 8606 4818 2904 688 5128 7917 7369 6996 9917 7743 3324 2183 9470 5499 8490 6725 9772 5590 5644 8139 7505 9786 2954 8082 7669 8464 8542 9507 197 8804 9355 8611 6348 20 7828 3622 7343 9299 5568 5746 5422 4340 3810 3311 1801 7605 3730 5661 1305 4878 8736 9320 8626 9444 3465 8522 3416 6708 3258 8282 7637 2924 5624 2062 2036 2600 1899 3452 5550 9379 71 7468 7131 973 20 4930 3881 5894 8933 163 8660 7981 7199 2996 8899 3773 2959 9668 2813 1095 7190 6466 2926 1340 5084 7684 2090 5542 3376 9107 5936 9756 7445 8418 9179 9412 6887 2172 3348 2009 1659 5210 2336 7587 6342 20 9301 8206 7372 7713 1255 5321 4599 4819 9904 7721 9811 5939 5667 3940 6228 1705 9150 1127 6658 5984 9224 3920 7269 2422 4081 1396 84 5630 1972 9292 3850 7672 5385 7625 9299 1222 6042 6640 713 3898 20 6190 2298 2590 524 8581 8209 9336 8819 1155 7732 8004 5994 4769 379 1776 5273 7255 8850 8142 1860 5884 5579 3205 1993 9567 7621 613 2504 2754 1961 4259 1326 8202 8944 3506 3202 2021 6784 868 2842 20 5189 9528 9908 8872 498 9958 8808 8036 6248 7753 3333 3303 1648 2133 9754 2890 1746 7567 9529 368 8046 4500 9797 3788 6990 6249 3033 3303 2497 5363 4892 253 9125 7686 3996 1152 9188 5975 3729 9157 20 2460 5436 3921 3414 6304 460 8027 28 6748 8050 8902 7556 7697 4794 1043 8699 2002 1039 6403 428 681 4500 8538 7647 5151 6159 2134 2535 1692 4339 6127 2215 5629 504 964 49 6429 8285 6335 5343 20 2900 3177 7971 5238 289 6949 7988 5367 5795 2292 3144 743 8390 2829 5340 1682 569 3541 4232 3826 6042 2261 9117 360 6761 8023 6309 81 5425 3190 6367 8996 4234 4677 1626 690 6057 4524 3168 9614 20 358 8205 7386 6312 4346 5100 4994 2726 6552 4916 3529 5578 2290 8946 6970 2647 9080 9051 8593 9631 8627 857 1886 1312 8355 9214 90 3512 9479 4412 8969 9610 2274 6189 7641 6355 5433 6620 7888 8987 20 4566 8338 7284 7770 417 6856 2260 606 237 5849 3059 7205 8518 5217 783 4945 8458 6873 7637 873 483 4289 478 6607 9314 2757 5729 4471 3459 1100 9438 3618 1388 8025 1233 3074 3681 8157 358 3493 20 699 270 1839 3417 8363 5569 8794 2622 9847 3173 7462 6431 9390 6682 5791 4292 5115 5057 6157 1521 1491 8574 2951 1947 5021 9231 3740 537 4030 5054 5325 4098 7516 1081 3002 3516 6139 2231 5404 1796 20 4580 2338 9021 9218 9862 3970 5379 4812 2685 4977 9904 1536 3483 4176 9759 9207 9744 4857 9911 3499 3950 127 7560 5236 5105 7818 49 563 8711 1244 9934 1805 7375 3291 3614 8955 3768 3589 4918 8993 20 6882 2805 6982 4822 4030 6717 1574 3093 6593 126 253 1486 3074 543 4713 7814 8377 8179 5775 4762 2919 7088 6732 5710 1017 294 235 346 5691 1137 3943 5153 6328 2573 9291 925 4018 6710 6836 7217 20 5055 6963 3858 7090 4904 8130 2661 8571 9685 9633 3073 4789 6851 2604 9250 9805 6503 7868 9006 9485 4639 2195 1120 2949 226 967 7677 6763 3981 596 7560 865 7955 9036 3518 7770 6342 9211 5196 2532 20 7321 2379 4984 8270 4427 4172 2040 4234 72 7283 5830 7398 347 1063 2030 6950 3714 573 7522 6059 6924 4047 9435 5082 9204 1232 443 2954 5486 1898 4278 5640 262 9159 9683 9262 9848 1041 8324 1723 10 886 9383 6915 2777 8335 7793 492 5386 1421 6649 27 2362 59 8690 3926 7763 3426 540 5736 9172 -1
31466755.50 26831168.00 32517698.00 30191703.00 25302802.50 38648954.50 34757642.50 32458851.50 32429083.50 26687038.00 43276083.00 30081338.50 23222479.50 37816185.50 24640636.00 36832908.00 39617207.50 33110715.00 32869170.00 39669283.00 32214600.50
-
result: Success time: 0s memory: 3808 kB returned value: 1
prog: Prelude.init: empty list


