"As mentioned earlier, practice hard. This is the only common factor that experts have. And for whom reached expert, I'll write a sequel from expert to master soon." (From my blog, Tutorial and tips to reach Expert). That soon happened to be 1.5 years after the first blog...... First, I'm sorry for the immense delay. Many bad things happened to me, like not staying in the Master rating range, having a health problem, etc. That's why I wrote the blog this late.
This is a sequel, but I am going to write the steps to Expert from scratch since the original blog(https://codeforces.com/blog/entry/81882) has poor quality.
Your journey is going to be divided into 4 sections. Each section contains the knowledge you need to have, the practice you must do, the performance you need to have in a contest, etc to advance to the specific rating.
Section 1. From the beginning to escaping Gray(1200)
If you found the site Codeforces and entered this blog, you will probably be able to code in a language or more(C++ is recommended for advancing higher for the reason explained later), but if you don't, search the basic material online or buy a book, and learn the language. But you don't have to learn crazy-complicated features of programming language like templates (Which I don't know). You only need to learn until if statement, for statement, and basic functions and classes. Other features are often unused in codeforces. For example, the code I used in the Contest when I got the performance of red only included these features and some standard library(which I will talk about in the next section)
What you need to learn to escape gray
Honestly, not a lot. Most of the 1200-rated problem(Which means people who have a rating of 1200 has a half-half chance of solving, and you should solve it if you want to escape gray) requires only basic mathematical and computational thinking, basic programming skills, and a small dip into the basic algorithms(dp, greedy, basic graphs, sorting, etc.) which you can escape gray, or at least get over 1100 rating even if you don't learn them.
Example of mathematical and computational thinking
I will show a few 1200-rated problems and solutions. These should give you an idea about how to approach problems and solve them.
https://codeforces.com/problemset/problem/1583/B This problem includes trees that you might not know, but don't be scared of. You can solve without knowing the tree. The only thing that you should know is since m is smaller than n, there exists a node that can lie in every simple path. And, why not make it that every simple path passes through the node? That is the solution.
https://codeforces.com/problemset/problem/1537/C This problem is quite hard, and you need two observations. First, a minimum of h1-hn can be found by sorting the numbers and getting the minimum difference of adjacent numbers. Then, you have to maximize the difficulty. You want more uphills and fewer downhills. Therefore, the uphill needs to be small and the downhill needs to be big. Start from the bigger number of minimum difference pair and make the smallest uphill by picking the next element in the sorted array. Then, make a big downhill from the biggest one to the smallest one, and repeat making the smallest uphill. You will arrive at the smaller number of minimum difference pair, and that's the answer.
How to practice
First, go to problemset and search problems having difficulty 800. Pick a random problem and try to solve it. These problems are not that hard, so you should not spend more than 20 minutes thinking about the problem. If you got the idea, you should note how you got the idea and what is the idea. This will help you get the idea for future problems. Then implement the solution.
If you didn't get the idea or your solution is wrong, see the editorial. You should note why you failed to get the idea and learn from it. If you didn't know the topic, you should learn it using the online materials, and solve a few problems involving the topic since it is going to be important in escaping gray, or later on. Do it until you can solve about 80% of the problem, and move on to the next difficulty until you can solve most of the 1200 difficulty ones.
Participating in the contest
After solving some problems, you should participate in a contest. First, take a div.2 or div.3 virtual contest to learn contest format, judge your skills, etc. Install carrot, and see if the contest near your standing has the performance of 1100(due to rule change, carrot is quite inaccurate, and having a carrot performance of 1100 is enough to make you escape gray), participate in the real contest. If you do well in 6 contests, congratulations! You escaped gray! otherwise, repeat "How to practice".
Section 2. Escaping div3 and into Expert(1600)
Solving problem is often not enough to get a higher rating. You often need to solve problems fast, and that's not easy, especially if you are fast-solving difficult problems. There, I recommend you to do fast-solving practice on the problem that has difficulty around the current rating-300. You should be able to solve these, so get yourself a timer, and see how fast you can solve these!
If you want to be a cyan, you should solve 800 difficulty one in 7 minutes, and 1100 difficulty one in 25 minutes. If you want to be a blue, then you should solve 800 difficulty one in 5 minutes, 1100 difficulty one in 15 minutes. Also, you should try to improve the accuracy of solving, since each wrong answer costs points and time. You can achieve this by testing the solutions before submitting them (though it costs you some time), looking for simple errors while coding, trying to prove your solution, and practicing to have fewer mistakes.
STL(standard template library)
If you are a c++ user then you MUST use STL. STL has implementations of lots of algorithms, and it will save you time implementing them. the most important ones are vector(array with dynamic size), stack, queue, priority_queue, set, map, string, lower_bound, sort. Learn them, solve problems using them, and try to understand them.
If you are not a c++ user, consider switching to c++. c++ can make your code run faster, and it provides the most standard library. If you are not going to switch programming languages, learn your language's library that has a similar function to STL.
As you progress. The problem requires you to know specific topics, and there is quite a lot to learn to reach a 1600 rating. You should learn DP, DFS and BFS, Dijkstra, bitmasks, binary search, basic combinatorics, two-pointer, and number theory. As you learn these topics, search for these topics in codeforces, and solve about 20 problems each. When you first learn them, start with a 1200 difficulty one, and gradually move up to 1700 difficulty one. You should allocate more time to each problem since it gets harder, but don't surpass 40 minutes of thinking, and see the editorial if you aren't able to find solutions.
Virtual participation is a feature that allows you to take contests at any time, allowing you to practice like real contests. You should participate in div2 or div3 since div1 is probably too hard for you until you reach the 2000 rating. Make sure you have 2 hours, take a contest, and use Carrot to examine your performance. If you can get 1600 performance consistently, you are going to go to expert after you take part in a few contests. Also, always solve problems you weren't able to solve in virtual participation until 1900 rating problems(the rest is unnecessary to upsolve until you reach an expert since it is too hard and/or has a topic that isn't needed until you reach an expert).
Using other sites
As you know, codeforces is not the only site you are able to solve problems. There are other sites that you can practice in, and the best of them is atcoder. Atcoder has lots of problems that require mathematical thinking and brilliant ideas. You can also learn some well-known ideas from problems there, especially in atcoder beginner contests(ABC). ABC has 8 problems each(it once had 6 problems, but the difficulty of problems C, D, E, didn't change that much), but you are only going to use problems C, D, E since the others are too easy or too hard.
Problem C: has a problem rating of around 1100, and should be quite easy once you reach cyan. Topics on problem C are basic math and implementation, and some computational thinking. Also, you can practice fast-solving in these problems.
Problem D. has a problem rating of around 1300(around 1500 in 6-problem contests), and they require topics required on problems C and basic algorithms I mentioned to reach expert. You should also try to fast-solve them once you reach a rating of 1400.
Problem E. has a problem rating of around 1900, but it varies a lot. Also, some problem requires you to learn topics that are not needed to reach expert or even reach master, so I suggest solving easier ones using this site.
Understanding types of contests
As you know, there are many types of contests, and understanding which one has a higher chance of increasing your rating is important. General rule: If you are highest among the participants, you have a high chance of increasing your rating. The following data is made by djm03178.
For cyans: You should participate in div3. cyans within rating 1501~1549 had their average rating increased by 27 in div3, but their average rating only increased by 3~4 in other contests. The same trend continues for all cyans except unrated(1500)s.
For blues: You can't participate in div3, so there are three options. Div2 only rounds, combined round(Div1+Div2), and Div2 with Div1 rounds. And the best among them is Div2 with Div1s. blues having rating 1750~1799 increased their rating by 17 on average in Div2 with Div1, 10 on average in div2 only, and their rating decreased by 3 in combined rounds.
For purples: There are two options for you. Div1 and Div2. And Div2 is far better. Not only div1 problems are quite challenging and foreign to you, but also participating in div2 means you're top, therefore increasing your rating a lot. Purples having a rating 2000~2049 had an average 15-rating jump in div2, but their rating dropped by 10 in div1.
Section 3. Entering div1(1900)
New topics and practice
As your ratings get higher and higher, there are more topics for you to learn. Not only do you have to solve more advanced problems you have learned before, but you should learn quite a lot of new topics. I recommend learning all topics that have a tier 1 rating in this blog. This is enough topics to reach purple or even orange. After you learn these topics, solve about 10 problems using the topic you just learned. This will give you an idea of how to use the topic in real problems. Note that these problems sometimes don't have the tag in codeforces, so you might consider using other sites such as USACO, and Baekjoon online judge(Unfortunately, this site is in Korean, so I will write a tutorial about this site soon.)
Your view of the difficulty
As you solve more problems, you should know which problem is too easy, and which one is too hard for your level to practice efficiently or not to waste any time in contests. A, B, Atcoder 100~300: Too easy. You should solve them in under 15 minutes, and solving them in practice is just a waste of time.
C, Atcoder 400: They are quite easy, but not too easy. It is quite a good idea to practice speedsolving in these problems if you are lacking speedsolving skills.
D, Atcoder 500: Its difficulty varies a lot, but it is just in range to practice efficiently for going to purple. For easier ones, you should try to solve them with no WA and in a fast time. For harder ones, just solving them in any way is enough. Try to think for an hour, and come up with a solution if you encounter these.
E or higher, Atcoder 600 or higher: These problems are too hard. You might use E or Atcoder 600 to go to the master, but all the others are unnecessary until you want to reach red someday.
Difficulties and how to overcome them
While you try to go to a higher rating, you'll overcome many difficulties. Your skill may be stagnating. Your rating might drop. You might perform well in practice but fail in real contests. Here's my advice to help you overcome them.
Your skill is stagnating: Check how much time you spend practicing. If you spend less than an hour a day, You are practicing too little. You should practice more, probably about two hours a day(or a virtual contest a day). If you are practicing quite a lot but feels stagnated, you might solve problems that are too easy or too hard. If you are, solve problems that are similar to your own rating. These problems are not going to be too easy or too hard.
You perform well in practice but fail in real contests: I suggest you do some virtual contests. They have the same format as real contests, and you should participate as such. You will learn skills such as time management, contest strategy, and a good mentality. If you are performing well in virtual contests but fail in real ones. It is likely a mental issue. Participate in real ones just like it is another virtual contest.
Your rating drops for no reason: Sometimes, it is going to happen. You might have bad conditions, the problem might not be best for you, your internet suddenly fails, etc. Don't care about your rating too much, and remember that as your rating drops, you have a higher chance of rating going back up in the next contests.
Section 4: To the orange(2100)
The two ways to go to the orange
As you know, purples can participate in both div1 and div2. While you will gain more ratings on div2, it becomes unrated after you get to the orange. Therefore, you have two ways.
Practice div2 problems and speedsolving more: This will quickly get you to the orange, and help you to solve easier problems of div1 quickly, but you might have a hard time solving Div1C or harder.
Practice div1 from here, and focus on solving harder problems: This path is going to be slow in reaching orange, and you might fall into blue sometimes, but it will help you to advance to a higher rating once you reach orange.
I will write about both ways in this blog.
The first way
What to do
You are going to be orange if you are able to consistently solve 4 problems fast enough or 5 problems in easier rounds. Therefore, your main focus is going to be speed-solving through easier problems in div2(solving the first three problems in under 20 minutes, and the fourth one reasonably fast), and extending your solving range to div2 E and atcoder 600 points(This is going to make your performance in the high orange range, and it will make you have an easier time in div1).
How to practice
You can get to orange without learning any new topics, since the list of topics I provided is a bit excessive for getting to purple, and learning only them is enough to get to orange. If you haven't learned all of them, you should learn them since these topics will pop up in harder div2 problems and div1 problems. What you should spend time on is solving problems.
Solving easier problems(div2 A~D) is done mainly to practice speedsolving. You should be able to solve average A in 4 minutes, average B in 7 minutes, average C in 15 minutes. If you are not able to do this, then you should practice speedsolving by grouping 5 to 10 problems of similar difficulty and solving them in one sitting. Problem D's difficulty varies a lot, so you should solve them one by one or in virtual contests, and compare your time to the real contestant's time. Don't mind speedsolving E, and just focus on coming up with an idea. If you want to solve harder problems, you might think about an hour. This is completely normal, and trying a hard problem for a long time is the skill you need if you are willing to go past orange and solve harder problems in div1.
The second way
Before taking the second path, you should note that div.1 problems require you to know a lot of topics and also come up with a hard observation to solve. This is different from div.2 where there are not a lot of topics until F, and there are a lot of problems that don't require hard observation. Therefore, you should solve mostly div.1 problems from here on out, since div.2 problems don't help you perform well in div.1.
Here are the difficulty viewpoints from the people who are trying to reach 2100. It will help you to practice efficiently.
A. Quite easy, and should be solvable in 10 minutes.
B. Quite challenging. You are sometimes not able to solve them, and it usually takes more than 30 minutes to solve them.
C. Very challenging. Your chance of solving them is about 20%, and even if you solve, it's at the end of the contest and/or has a lot of penalties.
D and onward. Almost impossible to solve.
How to practice
Your main focus is solving B, since solving B consistently and within a reasonable time is what you need to reach orange. I suggest you make a list of B problems and solve them one by one, thinking about a problem for about an hour. If you are not able to solve it, see the editorial and get the idea. It might help you to solve another problem.
That's it. Div.1 B doesn't(yet) require topics out of tier 1 in the topics list, and speedsolving Div.1 A doesn't really matter a lot(also, you should be able to do it from the practicing of div.2C). There's only one thing you can do to get to the orange and that is to solve problems. lots of them(There are virtual contests too, but they're still just solving problems).
I talked a lot about the way to improve your rating. However, that's of no use when you are not practicing hard enough. Practice a lot, possible every day. Try to improve yourself, and try to understand problems you weren't able to solve. If you practice hard enough, you will soon reach your desired rating.
Thank you for the blog!
Most of the 1200-rated problem(Which means people who have a rating of 1200 has a half-half chance of solving, and you should solve it if you want to escape gray) requires only basic mathematical and computational thinking, basic programming skills, and a small dip into the basic algorithms(dp, greedy, basic graphs, sorting, etc.)
what is "dp" means here ?
if it is Dynamic programming , isn't it an advanced topic?
Yes, dp is dynamic programming.
Some part of dp is indeed advanced, but basic dp isn't really an advanced topic. It's just a technique mastered by practicing a lot. Learn how to identify dp problems (usually min/max of some quantity given some constraints), learn a bit how to optimize overlapping subproblems, practice a ton, and you should be good to go.
My AtCoder rating is ~1370, and my atcoder perf is often around 1600 and sometimes 1900. But my CF contest result is bad. What should I do?
looks like you are suffering from 1.being math type and lack of implementation skills. 2.Time zone issue.
"I recommend learning all topics that have a tier 1 rating in this blog. This is enough topics to reach purple or even orange."
What exactly are you referring to from tier 1 rating? Do you mean difficulty rating?
Please make tutorial how to use Baekjoon online judge. I see ko_osaga has some exercise lists, for example about fft, mst, ... I would love to practice each tag like that, but there are some exercises that I don't know how to do, I want to see there are instructions on how to solve it, but I don't know how. I'm looking forward to your guidance on Baekjoon online judge. "Master CF. Master CF. Master CF"
My AtCoder perf is like stable 1600~2000. But my CF perf is quite unstable, and my rating is jumping like 1800~1900. What should I do?
Can You Suggest some resources from where the topics mentioned in the Escaping Div.3 Section can be studied ??
Some feedback: your explanation of https://codeforces.com/problemset/problem/1537/C is very hard to understand. That is particularly bad since it is aimed at "people stuck at 1200". Refer to the editorial which is much less verbose and much more clear.