Hi, Codeforces!
Recently, Wind_Eagle wrote a blog with his thoughts on practicing in which he asserted the standard advice to solve more problems is not a reliable way for gray/green users to improve. I don't agree with some of his conclusions: for example, he asserts that it is difficult/impossible to practice at the gray/green level without a coach; as anecdotal evidence, I have never had a coach coordinating my competitive programming practices, and I think many other top competitive programmers have also never had access to coaching. However, I agree that the standard "just solve problems" advice is not working, and I don't know what is the best advice to give to gray/green users on how best to practice, so I wanted to start a discussion of what has worked for people in the past.
Therefore, I have a request for everyone reading this blog: if you are cyan or above, please post a comment sharing what you did to advance to cyan (or perhaps even blue). Everyone is welcome to comment, no matter your current rank and no matter when you made the climb to cyan.
I'm hoping it should be interesting to see if there are any patterns in the responses (e.g. how many people had a coach? What sort of mathematical preparation did most people have? What resources did people use? How do all of things vary when we compare people who started competitive programming many years ago to people who started today?). I'm primarily interested in hearing what you actually did, not what you would recommend to someone else who's currently gray/green (though if you want to give advice after sharing your experience, please feel free to do so). The reason I'm writing this blog is because I think the advice we're giving is generally not working, so I'd like to learn more about what actually worked for others in order to get a better sense of what the "standard" path to cyan is (and how it can perhaps be made more efficient).
I'll start by posting a comment about my own experience and some thoughts on why training as a new competitive programmer is so difficult in the current landscape. I'm looking forward to reading what you have to say!
As promised, here's a quick overview of my path to cyan. I did math contests for five years before picking up competitive programming, which meant that my mathematical preparation was not a bottleneck during my first few years as a competitive programmer. (I suspect this is highly unusual--I think the math is a bottleneck for the vast majority of competitive programmers without that kind of experience.) I was introduced to CP through the USACO (I started competing in December 2015); I immediately advanced from Bronze to Silver and then didn't get anywhere on Silver because I had no knowledge of algorithm design, complexity analysis, etc.
The next year, I completed most of the courses in the Coursera specialization at this link, then started reading Competitive Programming 3. I found Chapter 3 of CP3, which covered several strategies frequently used in competitive programming (greedy algorithms, complete search, divide and conquer, and dynamic programming), particularly useful, and I think the night I read it was the point at which I learned how to actually think about programming contest problems. Afterwards, I promoted to USACO Platinum fairly quickly.
I started Codeforces around the same time. I tanked my first contest quite badly (getting hacked on A by missing the n = 0 case and missing B because I didn't know what the XOR operation was), but I made it back to cyan afterwards and climbed fairly steadily afterwards, only reaching my first real bottleneck around high expert/low CM.
A few thoughts on all of this:
Additionally, some comments on why I think training as a gray/cyan is so difficult:
Finally, a few thoughts on practicing. All of this has worked for me ever since I was blue/CM; below that point, your mileage may vary (in particular, my approach is largely to solve problems from the CF archive, and I'm not convinced that this works well for new competitive programmers). As a result, treat this as advice primarily intended for more experienced competitors.
Also, as many before me have noted, whether you practice at all is more important than how exactly you practice. However, the approach I outline below has worked for me, and if you follow it, then you'll be practicing rather than thinking about practicing, which is probably a step in the right direction.
As an example of this last tip, a few months ago, I failed to solve this problem in a global round. After reading and thinking about the editorial, I condensed it into a general problem-solving heuristic: when faced with a difficult problem about the structure of a graph, look for ways in which the graph can be simplified. Then, simplify the graph as much as possible and see if adding the constraint that the graph is fully simplified makes the problem easier to solve. Understanding that heuristic allowed me to solve this problem last week, even though the two problems do not appear at all similar.
Thanks to anyone who read all the way through--I hope you found some of this useful! If you have any questions (about my experience with programming contests, my thoughts on practicing, etc), please feel free to post below.
What are your thoughts on passing USACO Gold?
I've finished all USACO Gold problems, and I'm treking through USACO Platinum problems. Most of the Platinum problems I haven't solved are way out of my difficulty range.
I made USACO Gold in January of 2021 — I was specialist at the time. Since then, I've taken 6 USACO contests, all of which I've gotten 1 problem (except for the last contest, in which I got 0). This seems to suggest no progress on competitive programming, since my scores have plateaud and maybe even gotten worse. However, I have gotten significantly better on Codeforces, improving my rating from 1440 to 1940. Through that time, I've practiced exclusively on Codeforces — I just tag problems 2200-2300 and solve them. I suspect that USACO and Codeforces have little correlation, since my improvement on CF has not warranted USACO score increases.
Recently, I've thought of changed my dynamic, since my USACO isn't going to well. I've been solving more Olympiad problems from BOI, CEOI, APIO, and COCI. Do you think this is a good idea, if my target is USACO? More specifically, what style problems would help with USACO Platinum qualification?
My own experience with USACO is that people tend to either get rekt by them, or can solve them on sight. I spent about 3 years wondering why my scores were consistently 500 points lower than my elementary school friends (who mostly went to that school with 2 nutellas), then got a bunch of 1000s in senior year.
Not sure if this is much encouragement, but there is indeed light at end of the (rather long) tunnel.
I generally agree with rpeng--I don't find that I instantly solve USACO problems even now, but I do think it's easy to get a near-zero score by choosing the incorrect problem to focus on, and thus, if you make any strategic errors, you'll likely end up getting either a zero or a 1000 (strategy doesn't matter if you can just solve every problem). I also think there's a huge gap between solving one Gold problem and solving all three; the hardest Gold problems are absurdly difficult nowadays (e.g. I maintain that Bovine Genetics would be rated no less than 2500 if it appeared on a CF round).
For what it's worth, most of my improvement at USACO past the level of modern-day Gold came from solving CF problems. (I was a decidedly average Platinum competitor up until the second half of my senior year, when I decided to focus on CF rating as my main goal and ended up seeing my USACO scores improve substantially as a byproduct.) It sounds like this isn't working for you, though, so while I don't think that OI practice strictly dominates CF for improving at USACO, it probably is a good idea to switch what you're doing if your current approach is failing.
I'd also spend some time thinking about why what you're doing right now isn't working, both from the perspective of figuring out why you're having trouble with USACO contests (i.e., why aren't you solving the problems you miss, and what could you do to solve them next time?). Similarly, I recommend spending more time reflecting on the problems you solve in order to figure out how to apply the same idea in the future.
galen_colin made a video which discusses how one might structure/organize one's post-solving analysis. You don't have to follow the exact steps, but the process of reflecting after solving a problem is really important.
"I found Chapter 3 of CP3, which covered several strategies frequently used in competitive programming (greedy algorithms, complete search, divide and conquer, and dynamic programming), particularly useful, and I think the night I read it was the point at which I learned how to actually think about programming contest problems. Afterwards, I promoted to USACO Platinum fairly quickly."
Can you elaborate on what you meant by "learned how to actually think" about programming contest problems?
Wow This comment is too much informative Thanks Geothermal
I practiced a lot of 1300-1500s from Dec 2020 to Jan 2021 to reach cyan.
I solved 900-1300 problems trying to solve it using a good way necessarily. This way was to write a small understandable code and don't write anything if there is no a clear solution in my head. I practicated so for a 1.5 months and at some contest I noticed that not only 900-1300 but 1400-1500 are also solvable for me. In this time a reached cyan. When I reached blue I did it in a same way — I solved about 50 1600 problems and in two contests I solve 1900 problem after this I got blue.
Math. Contest math. AOPS. AMC/AIME. Maybe even textbook math. Did I say math? I honestly think being grey/green is not a cp related issue. It's a problem solving issue. Just do more math. Even if problems are not math related, doing contest math helps build creativity and an intuition for thinking about problems. CP adds the extra hurdle of having to code, so if you're grey or green, I'd just eliminate that hurdle entirely and go back to the fundamentals (solving problems). Once you do more math and are better at problem solving, most of the questions you need to do to reach cyan will seem trivial, except now you have to code it (which isn't the hard part for the vast majority of people). TLDR math.
Same here, can't agree more.
Can you recommend a website to practice math related problems?
Geothermal linked this website in his comment above.
Not sure about other people, but all people I know who have taken AoPS courses unanimously agree that the courses are useless if you have done stuff from this collection of mostly free resources and this set of books, but others might disagree.
AoPS has had a couple of major changes in recent(?) times to make it more "commercial" in some sense, so a lot of the people who used AoPS back in the day relied on the AoPS forums much more than AoPS courses/books that they published.
Some of my personal recommendations for beginners are Mathematical Circles — A Russian Experience, Problem Solving Strategies, How to Solve It and The Art and Craft of Problem Solving; and for more advanced people, I usually recommend IMOMath, Canada IMO Training, Darij Grinberg's website, Yufei Zhao's handouts, Evan Chen's website and Alexander Remorov's website. Of course, these are all resources that were around when I was doing math competitions (which was about 4-5 years ago), and many good resources have come up after that, but this is, in the spirit of the original post, what worked for me.
[Deleted]
Watched the Joma Tech interview with Errichto. Learned c++. Solved a bunch of leetcode problems. Found codeforces. Solved problems. Got to cyan.
Besides solving problems I also went through the MIT introduction to algorithms course, read most of CLRS, learnt manymany algorithms that I've never used. I do think that these also contributed to my rank, but they contributed much less than simply solving problems.
In conclusion:
I filter out and practice 1500-1600 problems and focus on them. I have CF Analytics Extension which is super helpful and allows you to know which rating questions you should focus on (you want to make the problems graph look like a bell curve).
I think it can be demotivating and disheartening to see blues or even purples solving below 200 questions on codeforces. I have solved over 600 questions and yet I just reached cyan. I am not sure if they have been practice problems on other platforms, or they are just naturally talented. However, keep in mind that solving more problems do help!
AtCoder Beginner Contest problems are less adhoc than those of CF so that might be an option for Greys/Greens (and others). Adhoc problems can be fun too but I get how beginners may want more immediate feedback for the algos and tricks they learn.
For my history: when I started CF about a year ago I had no previous online judge experience (but I did have a decent non-competitive math background, having solved the 200 first Euler Project problems for example and knew Python). I spent about a month solving old problems in the archive in chronological order. Then when I started doing the contests I got to mid Cyan in more or less one go (but I plateaued there — you can see my graph).
Now besides CF and AtCoder contests I mostly do Virtual Contests as practice and solve the CSES problem set (while reading the Competitive Programmer's Handbook among other resources) to learn new techniques.
When I was in the ninth grade, I participated in the Excellence Center of Informatics ( Centru de excelenta ), which was basically additional CS classes with extra curriculum, organized by the school (it wasn't very advanced: binary search, introduction to number theory, a few examples of greedy algorithms etc.). Here was the place where I learnt the basic CP stuff. When I seriously took up CP (in the tenth grade), however, a Romanian book became the main learning support I had, because I didn't have a coach and I didn't know many CP-oriented websites. The book was a shortened and more CP-oriented version of "Introduction to Algorithms" and featured slightly more advanced CS things, such as recursion, backtracking, combinatorics and DP. It explained things very clearly with a lot of exercises and problems alongside their solutions. It was incredibly versatile, as it presented the topics in a very structured way, which was very important for me as a beginner back then. I also used the sequel of the book to learn most of the graph theory I know (in fact, I think flows are the only graph concept which I didn't learn from the book).
When it comes to the online judge, until reaching expert on CF I almost exclusively used pbinfo, a Romanian website. The site includes hundreds of problems grouped into categories, like recursion, DP, greedy, etc. The problems themselves are very standard and half of them are variations of each other, but they were excellent training material nonetheless. Pbinfo also has an archive of OI problems of various dificulties which proved to be very useful.
Before taking up CP, I didn't have an impressive math background (only some random prizes in regional contests). I practised without a coach, using only books and (more recently) CP websites such as cp-algo and Codeforces as learning materials. I find Codeforces extremely valuable if you are already experienced enough in CP to know what to practise and to be able to tackle the ad-hoc nature of the problems. For beginners, I would say that Codeforces because of its ad-hoc problems can be too disorganized for practising. At least in my case, standard problems, featuring basic concepts, with a slight focus on implementation were the most suitable way of training.
Very interesting. I surely agree with Wind Eagle about the mathematical bottleneck.
My journey to Cyan (I will try to elaborate a bit more than required to try to mention everything):
Reached Cyan in a bit more than 2 months (Time frame : Dec 2020 — Feb 2021)
I had solved 188 problems on Codeforces by that time (Used no other platforms and had no significant programming background before, as in did not know things like vector and set in C++ but knew a little bit of python for machine learning).
Out of these 188, only 62 were rated above 1000 points.
I had no coach, not only for CP but for any kind of programming (Had some high-rated friends for motivation and tips though)
I read the competitive programmers handbook to understand the basics algorithms and data-structures (the first 30-40 pages in the book)
I believe the reason I could get rated specialist easier than a few other people here is because I was decent in using logic to solve mathematical problems due to studying for the JEE-Advanced college entrance examination.
I do not recall any specific topic I learnt in the JEE exam which I used to get to specialist. It was mostly the ability to think logically and mathematically.
One thing I am not sure about is whether solving Div 2A, 2B is an optimal way to develop logical ability. I do think that even Div 3A, 3B problems are fairly complex and not the easiest to pick for the literally beginner competitor.
Another opinion I see mentioned a lot is to ask everyone to solve problems only above their rating level. I think solving a problem which you only have a 50% chance of solving in a contest is very boring. I prefer solving problems which are a bit lower rated (100-300 points) than your level. This helps me practice for a decent enough time. Ofc people have largely varying opinions over this.
Good luck to all the newbies and pupils wanting to get better
I started with learning Data structures and algorithms. Then i learned about applications of Binary search, Sorting(merge sort) and Hashing. Then I just solved 100 problems(or until my ratings increased by 100-200) each having ratings +200 and +300 than my current ratings and also once in a two week tried to fast solve problems having difficulty <= my current rating.
I have been grey for about a year,and after learning and practising some basic techniques in luogu,I went back to codeforces then kept practising problems with difficulty of my rating+200,several months later I reached cyan. Now I stick again,when I can't solve a problem,in most cases it's not because I don't know the technique it needs,so I feel hard to improve myself now.:/
My path to cyan:
Then,
Am I improving? My CF score says the opposite, but I feel much better than before at data structures and, in general, at OI. However, I'm still weak overall (data structures bash isn't enough to solve OI problems). I think that I'm not training properly right now: I have trouble finding problems of the right difficulty and learning something new from them.
EDU section on codeforces + CSES free book & problemset.
Did you have a mathematical background before CP?
Hello! Thank you for this response.
Of course, I understand, that it is possible to train without a coach. I just said that I can't imagine this. Maybe this is just my problem, but I have never met someone IRL who reached cyan without a coach. I glad to hear that situation is a lot better that I thought.
Sure, makes sense (and apologies if I misinterpreted your position!). Thanks for your post today; I think you raised an important point about the failings of the standard advice we give to newcomers, and I'm hoping that the community collectively can make some sense out of the best ways for new competitive programmers to get started.
It is as simple as that : I learnt important techniques that occur often in Div2s or Div3s (Like binary search) and I learnt from my mistakes in past contests, other thing to mention is of course "Practice", but not on random problems, I focused on (Interactives, Math and similar, binary search, basic dp, implementation), and finally greedy skills which increase from normal practicing and participating in rounds (not necessarily on codeforces, there are other OJs like Atcoder, DMOJ, Codechef, SPOJ, CSES, ...etc)
I learned a programming language and started CP during my 4th semester in university.
I was never below cyan
For a more detailed answer: ICPC participants in my uni somewhat introduce CP to people that haven't done it before to "recruit" new participants, that being in a format of around 10 weeks with (weekly) a 5 hour contest, a 10-15 problems list about some topic they explained to us and some explanation about some topic (it starts from STL and gets into seg trees near the end). Since I had uni classes and this, it was hard to participate in cf contests seriously, I remember bombing back to cyan in a contest that I took right after the 5 hour contest while I was tired for example.
Other than that, I used 3-4x the time spent on those things with practice by my own, mostly doing virtuals and picking problems with few solves to try solving them while trying to really understand the solution. This could take up to a couple of days in a single problem depending on the problem, as I was a cyan solving 2500+ rating problems (usually they were around 2000 though probably, at the time there was no problem rating and I still think it's a shit metric) with the help of the editorial.
In my opinion, having experienced people around helped me a lot at first, but it served more as the start of my motivation and within months I passed almost everyone around me in rating, even though I considered (and still think this was true) that I was worse in most formats that weren't codeforces because I was too inexperienced even as a purple.
All in all, Introduction to Programming (1st semester) and Algorithms & Data Structures (2nd semester) classes along with some other logic classes were enough to get me to cyan level. I guess most people just learn enough to get past them though...
I had strong math background, when I started doing CP, I didn't have any coaches at all,
Just solve more problems
worked fine for me.How to reach master?
You tell us now :)
I feel that I'm speaking for a very limited group of participants here, but anyways. I had been an active participant in maths olympiads for probably 10 years, and got bronze medals in IMO 2020 and 2021. In the fall of 2021, I was introduced to CP by my math friends, and to me, reaching expert was barely any trouble. Most likely because that the ideas in many basic CP algorithms are also relevant in maths, and I had also been exposed to other programming books from a young age.
While I didn't have a coach, I had reliable friends that I could ask if I needed help. Throughout my road to blue, though, I barely encountered any difficulties, and that was all without a regular "coach".
The thing in Hong Kong is that there aren't that many CPers. In places like China, where there are hundreds of red, a blue is a nobody. But in Hong Kong, anyone can obtain the support of a great community, and from the team training sessions which weren't very hard to get to. Late January marked the beginning of my training in the form of team training sessions, where I also get to know the majority of the CP community in HK.
I know I'm speaking for a tiny minority, but the hardest part of CP for me (and other MO-turned CPers) is without a doubt debugging. I believe don't lack the thought capability to reach (and I'm gonna be confident) red, but I can barely code a bug-free DFS, and don't even know how to code DSU or segment trees and the like. The toughest tasks are generally graphs and data structures, and it takes forever for me to debug any data structure. For people in a similar spot as me, I would recommend trying a mix of tougher constructive problems and simpler data structure / graph problems, to acquaint yourself with the algorithmic part of CP.
Where can I find CP communities in HK? I am interested.
I took an algorithm course at university, had a coach and practiced in teams for regional ICPC contests.
Lessons from that time:
Also there was one problem that I have solved at least 4 times, about a year apart each time. It was nice to see how my coding style had evolved: Each time the solution was different, shorter and better.
Solving 1400+ rated adhoc problems helped me to reach cyan
When I started codeforces, everyone start at cyan (1500).
I never fall below cyan.
In any case, I think rating is a function of skill and knowledge:
Knowledge for me is something we need to learn "externally" (most commonly from someone or from reading, but can also be gained by experimenting). Examples:
Skill for me is something we already have, but can be improved upon ourselves. Example:
From my definition, it should be clear that both skills and knowledges are important. If we only try to solve the tasks that we can already solve, then we only improve our skills, not our knowledge. We can be very proficient with the skills and knowledges we already have, but we can only do so much without learning new knowledges.
Having a coach can help improving knowledges, but the coach is not necessary as long as we can obtain the knowledges from reading or other source. This raise the question of what to learn, and my answer for that is "what is used by others":
Virtual contest is a great way to improve both skill and knowledge:
So if I have this great framework of how to improve why am I still only a GM?
I payed 200$ to Mike and now I am blue
So, Can i pay 800$ to Mikkie and become yellow?
yes but also buy some cookies for him
is it from experience :P ? coz u know he might have stopped you at 1898 lol.
that's a visual bug, I have reached 3700 already.
I have a passion of learning foreign languages. I treat CP as if it were another foreign language.
In the past, I had learnt a few foreign languages. It took me years to be able to master a language. Looking back, I realize that even though in the beginning of the learning process I knew very little about a subject, given enough time I can slowly master it.
Now I combined my passion for foreign languages with CP. I watch CP videos in Japanese (for AtCoder), Korean and English (for CodeForces etc).
I started CP on March 2021. I practice CP alone and do not have a coach. I am currently a cyan.
I am never higher than Cyan.
I know after some years I will become higher rank, just like how I learnt foreign languages.
I have a secret coach. And I was doing MO from before OI. (I am still doing MO)
i forced myself not to look at the editorials and solved 1500 rated problems, when i was ~1300
Well, I started coding in 2018. And even in the start of 2020 my rating was 1350+. I used to solve problems topic wise like math, string, dp etc. Then during covid period, I started solving rating wise. Since my rating was 1350+, I started with 1500 rated problems and solved almost 200 of them. Then I also solved 1600 and 1700 rated problems. My rating also improved in this training process. And while solving this problems you will encounter basic topics like dp, bfs, dfs, binary search and some basic implementation tricks.
And as far as concerned about when you should go for editorials then I follow erricto's advice in this case. Keep trying till you don't run out of mind.
Moreover, in this case of difficulty wise problem solving, I don't have any idea like from which topic a problem belongs to. And I have to read the problem to figure out this just like contests. Though this process has drawbacks as well. As you have to solve lots of problems and progress is just too slow. But you will improve and that's for sure.
From my perspective, the fundamental question that determines whether you improve is 'am I learning from the problems that I fail to solve?'
Practice is obviously at the heart of improving, but two things will prevent this from being meaningful:
1) Practising entirely in your comfort zone
2) Attempting harder questions, failing, but learning nothing from them
When you fail to solve a question, read the editorial, read it again, check that you actually understand what it's saying, review techniques employed by other contestants, solve the problem, and write down what you now know that you didn't before. Save helpful templates in a library, if applicable. Even better, seek out similar questions and put the new knowledge into practice immediately.
I guess my experience is more like "what not to do", but that can be valuable too.
When I reached 1400, there was no such thing as cyan yet. It took me almost two years from when I was first introduced to cp (Feb 2013 — Jan 2015). I never had any MO experience, but maybe I got lucky to be living in one of the major cp cities of Russia :)
My practice routine has never been optimized or consistent. I was solving problems on Timus every once in a while and only joining codeforces to participate in rounds. On Timus I was sorting problems by rating (which is more or less the same as solve count) and solving them one by one. There are no editorials, but I was reading problem discussions after solving sometimes.
I had probably <100 problems solved in total. On cf it was 40 problems, with only 6 of them being 1200+ rating. I don't think I learned any algorithms at this point, but I became confident enough in my coding ability. I only learned some algorithms when I joined the courses that my local university organized for schoolchildren back in 2015-2016. And that helped me to reach CM (when it was at 1700).
My most significant progress was when I had a coach during the first years of uni (2016-2017), and I think having a coach could've sped up my progress a lot. Honestly, I think I would benifit from having a coach even now. If only there was someone to guide me to LGM...
Disclaimer: this is my opinion and it is not backed up by any evidence except my personal experience.
I would go as far as to say that in order to reach cyan, one needs to improve their thinking ability in general. It seems to me, that today the thinking ability of many people is degrading and it becomes more and more difficult to resist it. The reason is that more and more low-value and high satisfaction activities are becoming available. Things like social media, e-mails, Youtube and TikTok severely damage people's ability to concentrate. Concentration is essential not only for solving CP problems, but also for simply collating various facts and making coherent conclusions (let it be a loose definition of thinking). I have fallen victim to aforementioned services countless number of times and I cannot say that they helped me to think more effectively.
In order to become cyan, one needs to solve first two-three problems (two consistently, third is not required to solve consistently) of Div 2 round. When I am not able to solve them during contest and come up (or look up) with a solution later, more often than not these problems feel SO easy, that it makes me feel shameful that I could not solve them in contest. It seems to me that the only thing that stopped me from solving the problem was the absence of the clear picture of this problem in my mind. And I believe that this ability to have a "clear picture of the problem" heavily depends on concentration. So, try to decrease the usage of social media and similar services, as they are not good for your attention focus. Instead, read a book, try to summarize it and think about it (I was surprised, that this activity requires good amount of effort, at least for me), communicate, discuss things with other people and in general be mindful about your leisure. Every activity that ensures that you will be thinking actively and will be making an intellectual effort is probably beneficial for you.
Interesting take. I found math courses, competition math (I wasn't ever good at it), and solving competition programming on CF and Project Euler trained me to think for hours or days on one problem.
P.S. 3 helps you become better at 2, and 2 helps you become better at 1.
Were you actually gray/green? You only have few green points and even they probably weren't green back then.
There was a time when I was at a gray/green level, it just ended before I started CF. (i.e., it wasn't as if I started programming and was immediately blue level--I just practiced using other resources and didn't end up starting CF until I was already past the gray/green skill level.) This means I can't really relate to the experience of being hardstuck green on CF (which motivates this blog, so that I can better understand the experiences of people who were stuck at this level and ultimately managed to improve), but I do think it's fair to say I learned enough to advance past gray/green without coaching.
My first cf contest I was cyan, and all I had done before it was usaco training gate. I usually recommend complete beginners to complete chapter 1 then move to practicing random cf problems.
Before knowing about CP, I had just solved some problems from Advent Of Code. Then I got to know a regional CP contest, participated with no experience and solved nothing. This encouraged me to improve, so I started to practice seriously last year in May. I think the first month I was solving mainly 800-900 rated problems, but at least it helped me to understand the style of CF problems. Then the next month I just started solving 1500 rated problems. It was a high jump. I couldn't solve them at first but I read editorials, learning some topics.
So I just kept solving 1500 rated problems until I got to cyan I guess. The important fact was that although I wasn't into math olympiads, I had a math background, and most of the problems just felt like an interesting thinking challenge.
So, to sum up, I started solving 1500 rated problems from very early, and my math background certainly helped. I also didn't have any friends who were into CP at that time nor any coach, so it was just intensive self-practice.
I got stuck in newbie for long time, my rate then was about 1000 so I practiced in two different ways: first learning some important topics like binary search , two pointers , bit manipulation tricks and solve many problems on them. on the other hand, I practiced solving general problems from the problemset, first I solved problems with difficulties 1000 — 1100 then 1100 — 1200 and so on, once I feel I am comfortable with some range I increase the difficulty of the this range. Also upsolving problems that you didn't manage to get during the contest is very important.
I have a strong MO background when I embarked on my CP journey in September 2019. I immediately got a cyan performance in my first CF contest after about one month of practice, and I never fall out of cyan.
I suspect that this is very uncommon, because both MO and CF (and OI in general) are observation-oriented, although the tools are very different, the way to practice is incredibly similar, which led to my early cyan performance. The Um_nik blog (I strongly recommend this) can apply to MO as well.
For me, the journey of getting from grey to cyan (and even on expert) was just understanding how codeforces works, getting used to the problem structure/language and becoming better at solving problems that involve simple algorithms that I knew from the beginning of my journey. Thus, I felt like getting cyan is only passion and practice on what you are doing.
I have a similar story to a lot of other people but with a little twist. I had a pretty good math background from school times, but I only found out about the competitive programming 2 years after I finished my university, at the age of 25 (of course I knew about school olympiads and did some quickbasic stuff there, and heard something about some kind of university team competitions but I never really came close enough to it). At that point I already knew some basic C++ and with that the transition from math to CP felt very smooth and I was able to quickly jump up to 2100 (although two of my first contests being a very math oriented 2-rounds cup helped a lot).
Since then just solving problems worked fine for me and I was almost exclusively solving problems on virtual contests cause it was (and still is!) the most fun. I believe most of my cp related algorithm knowledge comes from scrolling e-maxx (and much later codeforces blogs) under a time pressure during a contest trying to find and copy-paste something to work.
I also read some parts of "Introduction to Algorithms" some time before the discovery of CP, but I didn't want to mention it before because I have mixed feelings about it being a good advice to start with. On the one hand it is a very good book and it gave me a lot of long-term benefits like the better grasp on concepts of complexity and how to think about algorithms in general (and some vague memories of what can I search for on e-maxx :)). On the other hand it doesn't at all help directly with problems you encounter when you start doing CP, and even later it's not very relevant, and it can certainly be too difficult and time-consuming to delve into.
Thanks for your comment! I'm curious--based on your rating graph, it looks like you stalled around 2600 in late 2021 but then quickly and abruptly began to consistently perform at LGM level. Do you have a sense of what changed for you around the beginning of 2022?
I didn't really change much but I practised a lot during these 6 months, maybe about 2 contests a day on average. In late 2021 I was still very rusty from the 3 years break and I think I also had a bit of an anxiety problem in some of the first rated contests I did after getting back.
I really liked your story, thanks for sharing. I am also curious to know what motivated you to begin competitive programming after finishing university? Have you had a full-time job while practicing on CP? If so, then how did you manage your time?
I don't really know how to answer to the first question, because I don't feel like CP is something that requires motivation, just like you don't usually need motivation to play a game or watch a movie or something. I never forced myself to study unpleasant topics or upsolve/implement some tedious problems I didn't want to.
At that particular moment in the very beginning I think I still had a half-time job, but even with full-time jobs afterwards I always had plenty of time for CP, maybe I am a bit lucky in this regard.
I usually need motivation to play a game...
I started observing what errors I make in thinking (like being stuck in one approach to a problem or over-complicating stuff) and began using that knowledge to improve my thinking processes. Also, when solving a problem, I began to ask myself, "What do I know and what this implies?".
The only thing I had (and now have) is being olympic at math. Up to participating at JBMO and taking bronze medal. So what mostly helped me get to where I am now is math == being good at logical thinking. That's how, for example I got to cyan just in 3 months with absolutely no knowledge of basic cp algorithm/ideas (even, for example, DP, Fenwick/Segment Trees, whatever else you can consider basic ideas)
For getting to the blue (where I am now) helped those two which I named earlier. (DP and segtree/BIT) Including my Math knowledge and experience, obviously.
P.S. Obviously, you have to know binary search, dfs, bfs.
That's pretty much everything that helped me to reach what I reached, will update comment when I reach CM.
I solved ~330 tasks from acmp.ru and after that i became cyan.
I suggest practising the ABCD problems in the Atcoder Beginner Contest
I thought competitive programming was interesting so I tried to participate in Leetcode and Codeforces contests. Leetcode had a lower barrier of entry for me, so I spent a month doing medium DP Leetcode problems then a month doing medium graph problems. These first 2 months were a struggle but I began to improve after that and now I just participate in contests and upsolve when I have time. Also I had no math/programming background as I am still in highschool.
you don't have to know much to reach cyan. just greedy, dp, constructive, data structure, brute force, 2pointers, prefix sum, point update range segtree, math and a bit of ad hoc should be enough to reach cyan