<html><head></head><body><div class="yahoo-style-wrap" style="font-family:Helvetica Neue, Helvetica, Arial, sans-serif;font-size:13px;"><div dir="ltr" data-setdir="false">After the Two Knights problem, I went on this next problem which requires that you separate 1..n into two sets with the same sum if possible. Again my algorithm in Haskell works but is apparently too slow. It fails for CSES test inputs >= 26560 where a solution exists.</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">I'm starting to wonder if Haskell is fundamentally too slow compared to other languages. From what I've read that shouldn't be the case though. For this problem it looks like it's doable in Python (I haven't tried that). Most of the fastest solutions for these problems seem to be written in C++. If there's anyone who's trying to solve these problems in Haskell (they're really fun by the way if you've never checked them out) and has solved this one (or Two Knights) and passed all the tests, I'd love to hear how you did it. Thanks.</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">---</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false"> <div><div>-- CSES - Two Sets</div><div>-- Given 1..n, separate into two sets of equal sums and if possible list the elements of each set of a possible solution or output NO if not possible</div><div><br></div><div>main :: IO ()</div><div>main = do</div><div>    line <- getLine</div><div>    let n = read line :: Integer</div><div>    putStrLn $ solveN n</div><div>    </div><div>-- Observe that sum [1..n] = n*(n+1)/2 so each set sum must be n*(n+1)/4 and so the set sum must be divisible by 4 for the separation to be possible</div><div>-- Then the algorithm starts adding numbers from n down to 1 until the next number would make the sum exceed the required set sum</div><div>-- At this point you add one more number, which will be the lowest number, to fill in the gap to complete set1. Set2 is then the other numbers.</div><div>solveN :: Integer -> String</div><div>solveN n</div><div>    | (n * (n+1) `mod` 4 /= 0) = "NO"</div><div>    | otherwise = "YES\n" ++ show set1_count ++ "\n" ++ (unwords $ map show set1_list) ++ "\n" ++ show set2_count ++ "\n" ++ (unwords $ map show set2_list)</div><div>        where</div><div>            set_sum = (n * (n+1)) `div` 4</div><div>            set1_part1 = takeWhile (\x -> x*(n+1-x) + sum [0..(n-x)] < (n * (n+1)) `div` 4) [n, n-1..1]</div><div>            set1_part2 = set_sum - sum set1_part1</div><div>            set1_list = set1_part1 ++ [set1_part2]</div><div>            set1_count = (toInteger . length) set1_list</div><div>            set2_list = [x | x <- [1..n], not (x `elem` set1_list)]</div><div>            set2_count = (toInteger . length) set2_list</div></div>----</div><div dir="ltr" data-setdir="false"><br></div><div dir="ltr" data-setdir="false">Julian</div></div></body></html>