Please read the new rule regarding the restriction on the use of AI tools. ×

tvmpqx_8601's blog

By tvmpqx_8601, history, 3 hours ago, In English

Introduction

Hello, CodeForces! Firstly, I would like to thank Mike Mirzayanov, as well other organizers of competitive programming events, and their sponsors for ability to freely (or at least cheaply) participate in contests (including onsite ones) and sometimes even win prizes. I have some -- yet not very outstanding -- experience in the field, yet have never really contributed something to the community. Today I would like to break such silence and write my first blog post with humble opinion on standard topic: that is, on how it is optimal to practice competitive programming. I understand that most people will not agree with me, but at least some will listen due to my rating exceeding theirs.

Context

In long distant year of 2018 when I started to compete, I had quite intense desire: to learn how to solve problems, or at least so I formulated my intention. Despite achieving some success in the field of competitive programming I have not been satisfied, and what is more shocking, I have left competitive programming as soon as I entered the university, with almost no desire to return. In fact, I never returned to do it professionally, recreation is the only goal which I now solve algorithmic tasks for. It is surprising, but I will try to convince my reader that it is not a mere coincidence, that I not only gave up, but that there were a such difficulty that was and is beyond my ability to penetrate through it and that was not yet discovered as of moment when I started but that was made open to be seen as of time when I ceased to compete. Let us again closer examine the initial goal of mine: to learn how to solve problems. Note that to learn to do something it is necessary to actually do it at least once, but not always it is sufficient. For example, suppose that one day you earned money by luck, then it would give you financial stability for some period of time, yet will not guarantee that you get money again. Just like that, I managed to solve some problems by luck, yet in other occasions it was not guaranteed that I would solve some more, and, in fact, I would not have succeed in many cases despite previous success. What it means then to learn to solve, and not simply to solve? It therefore means to acquire apart from the solution to give problem per se something more, something else, let us call such thing a method.

Method

Goal of practice therefore is to get to know the method of solving problems. And quality of approach to practice can be meaningfully judged by ability to produce effective method. That is, approach to practice is method of gaining a method to solving problems. Many blogs that were already written outlined one or other approach to practice, yet did not try to evaluate approaches, it is not coincidence but implication of the fact we as community do not understand the content of methods that we use to solve tasks, and therefore cannot deduce how to teach them to newcomers. Does there even exist singular method to solve problems? Although it is hard to disprove existence of something, I would like to make provocative conjecture that such method simple does not exist. If we are lucky, then, maybe, there are some large classes of problems so that each of them is solved by a singular method, but it might very well be the case that even such scenario is more optimistic the real state of things. That is, it might be actually that all problems are ad hoc. Indeed, if conjecture is true, it explains why some many people never really get to learn how to solve problems, and that cannot meaningfully evaluate efficacy of practice regimens. Even if you actually open blogs with opinions on how to approach solving given problem, they usually simple contain list of heuristics at best, and list of "motivation quotes" at worst.

Courage of hopelessness

If we conclude that we do not know yet how to solve problems, that we only know solutions of some problems, but do not know exactly how our production of new solutions functions, we have two options. Firstly, we can abandon search completely and simply solve each problem as in case study, that is, without general system of how to solve. Or, secondly, we can actually try to gain knowledge about how the solutions become to be known, how ideas are born, or at least on which hypothetical method do not work. Then we can finally have basis for meaningfully judging which regimens of practice are able to produce knowledge of method that give ability to solve tasks and which are not able to. In both cases, we can understand that current predicament is that we have blogs about time management and choice of topics, as well as blogs with heuristics and pointless motivational phrases. That is, we do not as of now yet have any body of knowledge on how solution to a problem is produced by contestant, and how such skill is gained. We move in darkness.

On current strategies of practice

Most popular advice is "to simply solve more problems". It is clearly vicious circle, because it required already being able to solve, and therefore teaches nothing. Another common advice is to learn standard algorithms, techniques, to analyze and understand editorials of famous tasks. Such advice again completely misses the point, because after understanding a well-known algorithm even perfectly, I still need to figure out how to apply it, and when it is even helpful at all, which advice does not explain how to do. Yet both advices are relevant not by mere coincides, but because they indeed give necessary conditions as to solve problems, but not the method (if such even exists). Instead, they give "raw resources" for the method to apply on, matter of what is to be transformed into solution of the problem. Another common, yet more advanced advice is to analyze content of the problem itself, to understand internal workings of the objects that the problem statement mentions. (E.g. if it mentions a set of things, then how large the set is, what can be said about its elements and so on?) Such imperative again does not show any method of solving, yet it reveals one of goals of subroutines of mind-machinery that produces solution, that is goal of decomposing of the task into smaller tasks and therefore easier, or of abstracting details away and therefore solving perhaps more general but easier task. But again, it only helps to deduce the pattern in which it is handier to produce solution, but not how to produce. Moreover, it is not always the cases that problem statement is analyzable at all, sometimes solution is directly assembled from standard techniques without analysis of the mentioned objects, or even straightly guessed.

Epilogue

That is, even if you apply standard technique because you dislike ad hoc tasks, the choice of what and where to apply at least seems ad hoc, at least for now due to our lack of knowledge of how the solution is produced by a contestant. From such blindness comes following "strategy" of how to practice: simply try different things like reading editorials, or in opposite to solve without editorial, solve from different sites, learn even useless at first sight algorithms, solve even problems that look like they will not be generalizable to problems in new competitions, that is, do not comply to single regimen of practice, instead simple see what works and use it. Also, do not take practicing competitive programming to seriously, because you are probably pursuing an illusion, search for which became popular only because some IT companies use algorithms as means to filter candidates that apply for their vacancies. If your financial status, career and so on do not depend on your success in competitive programming and you feel like you are stuck, I would suggest considering simply quitting it for a field where more cleanly articulated method of doing it exists. For example in mathematics it is also not clear how new knowledge is gained, but math is at least able to produce general algorithms and techniques that are then applied in our problems. We, competitive programmers themselves, are not able not only to explain how exactly we understand which techniques to apply, nor to produce such techniques. We are therefore moving, but moving in circles, as we are not conscious of what directs our movement, and mostly blind to see in space of which nature we are moving.

  • Vote: I like it
  • +12
  • Vote: I do not like it