### robot-dreams's blog

By robot-dreams, history, 3 years ago,

I'm interested in improving efficiently, and the main advice I see (on blogs, comments, CP Discord, etc.) is "solve more problems". For someone who's not solving any problems yet, this is great advice. Additional detail seems unhelpful because getting started is WAY more important than nitpicking and prematurely worrying about efficiency.

But how can someone who's already solving a lot of problems improve more efficiently?

#### How should we choose problem difficulties?

Someone who's already Expert probably won't get to the next level by solving 500 problems that are all Div2A. I often hear "solve problems that are slightly above your current level", and once again this is great advice. But it's important to sometimes mix in "easy" problems for practicing speed and staying motivated. How should we balance the two?

#### How should we choose problem topics?

I've heard arguments for choosing problems randomly, but it makes sense to sometimes choose specific topics to address weak points or review important concepts. When should we do one or the other?

#### How should we structure our training schedules?

My friend who does competitive gymnastics said that his training schedule goes "Hard, Hard, Easy" (two sessions of intense training followed by one session of lighter training, to help with recovery). How should competitive programmers structure their training schedules?

#### What should we do after getting AC?

One way is to just move on to the next problem. But Polya's book "How to Solve It" talks about four steps in problem solving: understand the problem, make a plan, carry out the plan, and look back. What are good ways to do "look back" so we can get the most out of each problem?

#### What other activities should we do?

Obviously, there's participating in contests. But besides that, is it helpful to read textbooks? Prove theorems? Watch streams? Play Zachtronics games? How helpful are these activities compared to only solving problems? How should we divide our time between these different activities?

I know there's no single answer to these questions that works for everybody in every situation, but I'm still interested in hearing your ideas.

• +204

 » 3 years ago, # |   +61 Maybe another question that you can add is whether to solve individual problems or to do full timed contests.
 » 3 years ago, # |   -34 I think its very easy to do better. Just watch more twice. Duh
 » 2 years ago, # |   +13 The way that I've trained so far is split into two modes: contest mode and learning mode.First thing is it makes sense to practice like you compete: contests. I consider there to be three stages to a contest: during, upsolving, and retrospective. First you do the contest and solve the problems you know how to. Next you go read editorials and solve the problems with help. Finally, you look back, say "why could I not solve this problem?", and fix it if you can.That brings you to the learning mode. When you encounter an algorithm you didn't know before you need to practice it to be able to use it. If you practice by finding problems that use the algorithm and solving them it will teach you how to recognize it as well as how it works. Both are important. I usually write it 3-4 times from scratch to make sure I understand it well.All that said, I think that competitive programming is unique in how it mixes talent and practice. Even if you are practicing the best way you can, there may be people who improve much faster than you do. Don't let this stop you.
•  » » 2 years ago, # ^ |   +14 For ad-hoc problems (and also those requiring observation), which gets more prevalent in the more difficult problems, do you think one should spend more time thinking about them before reading tutorials?
•  » » » 2 years ago, # ^ |   +52 So when I trained on ad-hoc I again spent about 10 minutes on thinking, unless the problem was from an OI (APIO, BOI or IOI). On these problems I spent an hour or so because they involve more observations. Also something I forgot to mention in the comment above. After I had a training session, I always read a significantly harder problem and I was thinking on it in the background. For example when I was travelling to school, washing dishes and etc. Then at the beginning of the next session I read the solution (if I still didn't know how to solve it).
•  » » 2 years ago, # ^ |   0 Very good advices, but read editorial after 10 minutes of thinking is it improve our thinking abilities if we know algorithms that may be used in this problem? It looks like remember solutions for problems, and also what to do if there is no editorial for problem because lot of OJs have not this. Sorry for my bad english and thank you for share your strategy.
•  » » » 2 years ago, # ^ |   +17 Well the reason I think reading the editorial after 10 minutes is sufficient is because you do this for topics you are weak at. If you don't know the main ideas that are used for such problems, what is the point of wasting your time? You may find it fulfilling to come up with one of these ideas yourself, but you will spend more time on this and in the long run I don't think it will be very useful. At least in my experience, 10 minutes of thinking still improves your thinking abilities as you learn the direction in which you must think when solving problems on a certain topic.About the OI problems. You are right that there are a lot of them without tutorials, but there is oj.uz (<3) which has the majority of OI problems. You can find a clear written code in the submissions there (sometimes there are even comments on what is the idea). So not having an editorial isn't a problem.Btw when focusing on OI problems I suggest checking out the JOI spring camp as the problems there are of high quality (unfortunately there are English statements only for 2017, 2018 and 2019).
•  » » 2 years ago, # ^ |   +1 I train for 3-4 hrs every day on 1900-2300 problems, if I don't get a problem I don't look at editorial for atleast a day, 70-80% of the problems I come up with solution by then, compared to 30% success rate in first 10 minutes. It's so satisfying to do that instead of looking at solution, do you think it's hindering for my rating growth?
•  » » » 2 years ago, # ^ |   +18 Well you should try training like I described for some time (for example a week or two) and see if it works for you. I think you will be satisfied with the results as you will learn more new ideas, but the process of training probably won't be that satisfying.
•  » » 2 years ago, # ^ |   0 By "Your rating", do you mean my current rating or my max. rating? Also, thank you very much for such a detailed comment.
•  » » » 2 years ago, # ^ |   +4 Well you should check. If "your rating" + 200 problems are quite hard for you, go with them. Else I suggest you go with "max rating".
•  » » 2 years ago, # ^ |   +4 Well, probably reading editorials is a good idea. I almost never check/pay attention to them, even after on-site contests. It is common for me to think about a problem for a long time, more than a week, because I really want to come up with the solution myself, without any kind of hints from outside.In the end, my performance is very unstable: sometimes I can solve hard problems, but other times I am unable to solve some stupid shit, while everyone else get it quickly.
•  » » 2 years ago, # ^ | ← Rev. 2 →   +4 Well thanks for sharing those things... yet one of the question I feel which was very valid asked by the author was : How to extract maximum from a problem in which one just received AC ( Author asks this as : What should we do after getting AC? ) Could you throw some light on this as well @radoslav11... It would prove very helpful...
•  » » 2 years ago, # ^ |   -9 NICE
•  » » 12 months ago, # ^ | ← Rev. 2 →   -48 .
•  » » » 12 months ago, # ^ |   +40 I am sorry, but nothing will help you until you learn to read.
•  » » » » 12 months ago, # ^ | ← Rev. 3 →   -9 .
 » 2 years ago, # |   +52 Definitely Zachtronics games.
 » 2 years ago, # |   +57 radoslav11 pointed out that in order for one to get 2300~2400, the most important thing is to keep learning about algorithms/ideas/trick. That's why he said that we should look at the tutorials in ten minutes.For me I think ten minutes might not be enough. Sometimes I read about the tutorial in ten minutes and found out that the idea is not that hard and I could have solved it with things I've learnt before. I'd say the process of "trying to solve a problem" is also important since it is exactly what we need to do in a contest. One supporting view from E869120's blog along with EnumerativeCombinatorics's comment is that one should not never look at the tutorial before one solved the problem.I suggest setting a dividing line here: For problem of difficulty $\leq 2200$, one can look at the tutorial after 10 minutes since a large part of the problems are related to some common tricks. For problems of larger difficulty (,say, $\geq 2300$), one should at least try for a longer time to think about them since we want to train our instinct on hard problems. (We will spend a longer time in a problem for sure, but we might benefit from that in long run.)For me, I am not sure that my last point (for $\geq 2300$) is suitable for everyone. I am also trying to figure out whether it will work for me (I will also try radoslav11's method). Let's wait and see.
•  » » 4 weeks ago, # ^ |   +3 @RobeZH Were you able to try it? What were your observations?
 » 2 years ago, # |   +28 One thing that I have found to be very helpful is to look at submissions of people who solved problems very fast. Editorial is good for getting an idea, but I am constantly impressed by the simplicity of the top participants code. Some people have very bad code with lots of #DEFINE lines and bad variable names it's pretty much unreadable, so you might have to check a few people before you find someone good. But you will often see ideas on how to implement something efficiently that the editorial won't show you.