This is a reasonable portion of what I did for math olympiads; the other parts were doing lots and lots of problems and acquiring a solid technical background.
One thing I worked on in particular is formulating good solution strategies, where I could see the general steps of a solution (or the steps of a good approach) without having to actually fill in all the details of the approach; this involves having good heuristics for figuring out what is true/false and what can be proved without too much effort (and then deferring the actual proof until later when all the pieces have come into place).
FTR I was a USAMO winner (top 12) in high school but didn't make it to the IMO team. I did make the IOI team though. I'm currently coaching at the US IOI training camp for the next week, so I don't have much spare time right now, but maybe when I have some I'll share in a bit more detail the things I did (just a warning, this was before I started optimizing my behavior so while it apparently worked it was probably not an optimal trajectory).
(I expect top programming contests are harder/less feasible to train for at levels outside raw ability. It all happens too fast.)
Lately I've resolved to try harder at teaching myself math so I have a better shot at the international olympiad (IMO). These basically involve getting, say, three really hard math problems and trying your best to solve them within 5 hours.
My current state:
What does the intrumental-rationality skill of LWers have to say about this? What recommendations do you guys have for improving problem-solving ability, in general and specifically for olympiad-type environments? Specifically,