I would divide the skills required for programming competitions as follows:
- The ability to think abstractly.
- The ability to employ well-known algorithms and algorithmic techniques.
- Knowledge of previous competitions tasks.
- Flexibility of point of view which allows to find easy implementations.
- General problem solving techniques.
Skill (5) consists of ideas such as "backward reasoning" and "reversing a task" (these are not even specific to exact sciences).
Skill (4) is an art which is gained mostly by experience and also by looking at work done by other contestants.
Skill (3) is obviously a matter of experience.
Skill (2) is attained by thorough preparation including both solving problems and reading algorithms books.
Skill (1) is again an art, but this time it is an art which has much in common with other branches of mathematics.
Let me give you some examples from the latest International Olympiad in Informatics (IOI2011, http://www.ioi2011.or.th/tasks):
Task RICEHUB (relatively easy) requires an insight similar to task POST from IOI2000, which is an example of skill (3).
Task RACE (relatively hard) is mostly a matter of applying a known technique. The easiest way to solve this one is to try known techniques one after the other until you realize which one gives an efficient algorithm. I think it's very hard to solve this if you approach it any other way (I'm not giving details of the solution to avoid ruining it for you. There's a solution on the website). So this is an example of skill (2).
Task PARROT (relatively easy, but conceptually new in IOI) can be used as an example of skill (4). The "mathematical" solution is not too hard, but there are implementation issues. Again, in order not to spoil the question, I would just suggest considering task MAGIC SQUARES from IOI1996 and task TWOFIVE from IOI2001 which involve implementation details similar to the ones in PARROT (MAGIC SQUARES is easier than PARROT and TWOFIVE is harder in respect to those implementation issues).
As for skill (1), task CROCODILE from IOI2011 can serve as an example, but I'd rather give you a cleaner one which also serves as an example for skill (5):
Consider the well known egg-droping problem (see http://www.ocf.berkeley.edu/~wwu/riddles/hard.shtml).
To solve this problem one should first reverse it and ask "what's the highest building I can solve with up to $t$ throws?". To solve the reversed problem, one should employ backward reasoning (reversing and backward reasoning are examples of skill (5) ) and say: Let's try to sketch a solution strategy: The first throw would be from... well.. I don't know where from. So let's denote the floor of the first throw by "t_1" and continue from there. I will not continue describing the solution, but note that "let's denote the floor by a variable and continue" is an example of abstraction. Instead of a number of a formula, we just accept the fact that we don't know what this floor is yet, make up a variable to denote it, and continue.
(you may find tasks from IOI up to IOI2008 in http://ioinformatics.org/history.shtml).
From my experience with students participating in IOI, I would say that the ones who also participate in IMO (or otherwise very oriented toward mathematics and not just computer science) are:
- Always on top in regard to skill (1)
- Tend to be better than others at skill (5)
- Have a potential to become exceptionally good at skill (4) after some hard training
EDIT:
As a final advice: Try solving many tasks. Code any task you solve to make sure you understand all the details. After solving (or trying long enough), always read an official solution or discuss the solution with someone else. In a more advanced stage of your training, read tutorials you can find on the web especially about data structures. You can find some of these on TopCoder's website.
As topics which are traditionally considered as mathematics and not computer science:
- Mathematical games can be relevant to programming competitions.
- In many computational geometry tasks it may be worthwhile to feel comfortable with convex sets as mathematicians think of them (maybe this is a bit advanced).
- General mathematical experience and rigor can help you avoid wrong solutions which intuitively seem correct.
Overall, I'd say that the best way to become better in programming competitions is to train specifically for them while getting general mathematical education.
There are not many "traditional math" topics which can help you directly with those competitions.
(probably the best and most relevant way to get general basic math education is to take "Linear Algebra" in university or to learn the same material elsewhere. Again, this is not directly relevant, but eventually your problem solving skills would benefit from the rigor you will learn at such a course).
I have studied both CS and Math (I have written two MSc theses) and I can really capitalize on that. Still, I work in academia where the approach is much different. As a regular programmer you wouldn't need much math, but that also constraints areas you can work in. For example you don't need any calculus or differential geometry to use OpenGL, however if you would want to create your own image filters (not just use black-boxes), maybe do some audio-processing or physics, math is essential. What's more, from my perspective, all interesting problems involve math to some degree (on the other hand, from my perspective those wouldn't be interesting if it weren't for that math...).
Concluding first paragraph, I urge you to study math. The thing to decide is how you are going to do it: at the university or by yourself. The second option is available only if you are motivated enough, the first one is constrained by the time you have.
It is more feasible for you to study by yourself if you want to learn just one domain that you like, however, probability that you will need more that one (e.g. calculus and probability theory, or differential equations and numerical methods, etc.) is huge, and then going to campus is recommended.
Whatever you do, please look for courses/books that deal mostly with applied math, as a computer scientist you more often use math that invent new theorems. About the curriculum -- it varies so greatly that I can't be of any help here, the only thing I can say, that nowadays probability theory (not just statistics) is present almost everywhere, and the calculus is sure second to follow (if not first).
(Please note that this only my opinion that is based on info from my friends (they may be numerous, but certainly this is not a representative sample). I do not have any real statistics to tell. To those that think I am skewed for my field: I deal with abstract algebra, graph theory and logic.)
Best Answer
If you wish to learn how to make 3d graphics to use in an existing game engine, you won't need more than very basic maths.
However, if you wish to develop game engines, you will need linear algebra, vector calculus and graph theory skills, and you will need to learn how to program!
Calculus' applications in game development are extensive. Physics is a typical example.
Graph theory is what you will crucially need. It underpins the theory of algorithms and data structures used in complicated software engineering. Algorithms such as Dijkstra's and Prim's are essential graph theory for software engineering.
Some nice introductory books are:
Thomas H. Cormen - Introduction To Algorithms, MIT Press.
R. Balakrishnan, K. Ranganathan - A Textbook of Graph Theory, Springer.