Why I do Codeforces
Recently, I spent a lot of time solving problems on Codeforces. These problems are similar to those I had encountered in undergraduate classes, such as Discrete Maths, Automata Theory and Algorithms; classes I didn’t do particularly well in.
Often, I was quite nervous before their exams. I didn’t back myself to be able to solve the problems. I guess I simply didn’t understand how problem-solving worked. I expected that either a solution would just pop in my head or it never will: I would just stick with the first idea that fruitlessly try to knead it into a solution. I didn’t play around with examples, create smaller subproblems, consider different hypotheses etc. On Codeforces, I could practise these strategies without consequences (such as grades).
Having solved roughly 400 problems, I am more comfortable with the problem-solving process. Even if I don’t end up solving a problem, at least I give myself a fair chance. I try out examples, create hypotheses, either prove hypotheses or try to construct simple counter-examples. Sometimes, different hypotheses combine into a solution (as in square-root decomposition). If nothing works, I write a program to generate small examples and see if a pattern arises. If still nothing works, I go and smash the day’s Wordle and feel happy about that.
Now, instead of solving more problems, I want to take a step back and document some interesting problems and problem-solving techniques. This is slightly redundant work because problems are reviewed at length on Codeforces itself. Even so, I think that writing about them will improve my skills.