Hello there. I would like to share my experience on how I reached Expert in my first 6 months. A few people asked me about that so I am writing a blog for everyone to see and the techniques I used to reach expert in 6 months. I started Competitive Programming 8 months ago. I didn't know except some basics about visual basic programming language and I didn't know except to do some GUI and write basic code. I was introduced to CP and how important it was from university admissions to job interviews. I began to learn step by step new ideas, new algorithms etc... From my experience, I would like to share those important tips from my point of view:
Always take rating seriously and compete online in many sites. Rating sometimes doesn't mean your real performance. Your real performance sometimes might be worse or better than your rating but it won't be further than +100/-100. If rating was to be taken seriously, you would try your best to solve the problem within the contest and prevent rating loss.
Learn new algorithms and data structures. Learning them is very important(for example DFS,segment trees,Dijkstra,etc...). Mathematics is also very important(especially forming equations,number theories,combinatorics,etc...)
Don't solve too easy problems. Solving too easy problems won't make you get better. Also, you should solve on the topics you are weak on and solve randomly(random solving problems a little bit higher than your rating is one of the best practicing techniques!)
Check the editorial if you failed. Failing is part of the training. Even if you find that you fail a lot, failure will turn to success after you learn the new ideas/techniques/ways of thinking. Most importantly, you should check the editoral if you failed to solve the current problem.
I hope those tips help. I also thank JoeSherif AnasAbbas Shalaby for helping me through the training and practicing! Also, I was inspired by Benq's rating and how he became LGM in only 3 years showing that nothing is impossible! Thank you for such an inspiration!
Well, maybe segment trees are not needed for the beginning of expert. But I am sure something like DFS is very important same for Dijkstra. Maybe it is not needed at the beginning as codeforces writers don't put a lot of data structures in div 2 A to C, but it will be important the step after it. What I am trying to say is to keep everything balanced and practice on everything. It might be a bad idea to be very skilled in greedy problems and perform poorly in data structures problem. There must not be a big gap between those or else, reaching the step after it(Candidate master) might be really hard!
Edit: Take part in division 3 only? Are you serious? That is a really bad idea! I'd say division 2 is way more challenging than division 3. Also, division 3 don't happen except like once per week. A person should participate in online contests way more than that!
I don't think reading an article and practicing some few data structures will really consume your time. Also, in few cases, some problems have another solution other than the main solution. Maybe the person couldn't get the main solution? But he might be able to get the other approach that might be harder and require data structures and algorithms. Learning new stuff doesn't hurt especially that it will be used in the future!
I don't think you understand how Competitive Programming works. Competitive Programming is not about coding a monstrous 500 line solution (filled with clever algos and data structures) for a problem that requires a 5 line solution. And honestly, how many times have you seen div 1 level stuff being asked in div 2 A, B and C?
Sure. You can over-complicate stuff by throwing in all the advanced data structures and algorithms for a simple div 2A. But how long's that going to take you to code? The key here is to use the simplest solution that works (i.e. gets AC). No one cares about anything more than that.
In some rare cases, a person might find that simple solution complicated. Everyone's brain is different. I will give you a very simple example of a combinatorics problem that can be solved DP. Some few people find that getting a combinatorics equation is easier than getting a DP solution. Others find that writing a DP solution is a lot easier than getting a combinatorics equation. Everyone is different and you cannot change that fact! Yes, you are true. Thinking about the simplest solution is the target of CP. But in some few cases, you need to over complicate the solution to solve the problem. Over complicating a solution and solving it is better than just leaving it and not solving it at all!
For me learning crappy stuff did waste my time, I was dumb because I thought some data structure or a fancy algorithm would help me solve things. I performed much better by instead just doing problems that appear in contests instead of learning random stuff hoping it would help me someday.
Look, I was a newbie but when I ignored the rating and entered every single round I became specialist as I started to convince myself that if I deserved to have a higher rating I will have a higher rating so I entered every contest with this thought till I became specialist.
A very cool article, but there are two important things as well, which are the speed of the solution and the testing of the code before it is submit, I believe that its acquisition depends on the number of problems solved and the difficulty of these problems, good luck, and thanks for this article.
No No No. Speed is not even the problem. Believe it or not. Even if a div 2 contest were 20 hours long instead of 2 hours, many green/gray/cyans will still be stuck at solving problem A/B, not because they are slow at implementation. But simply because they did not get the correct solution in the first place.
Sometime i get the idea sometime not, how does higher rated people get the idea/trick behind div2 A,B,C every time and even so fast, now for that should i blame my brain or there are some ideas which repeats(in some form or other) which after practice i can master? if so how much practice?
One mistake I often did when I was a beginner was that I would often over-complicate stuff. Just think about the "simplest way" to reach the solution-this philosophy works for div 2 A and B , sometimes C. Just think out some math, greedy,etc and it works most of the times. Don't get too worked about it, sometimes Div 2 A and B are indeed harder than usual. As for the practice method, just practice a bunch of Div 2 A and B , say, from the last 20-30 contests. That would suffice
Yeah, I agree. Usually, Div2 A and B are designed to be really easy (they were too in the round a few hours ago, I just missed the easy solutions). For practice, doing Div2 A and B problems from previous rounds is really good, but a very good site to learn cp is I strongly, strongly recommend going over the problems in that guide, it was made by some of the top programmers. The ordering of the problems is based on USACO divisions, but you can think about them like this (I've edited this now that the difficulty has changed over the past year; see edit history for the previous comments, also don't take this too seriously):
Everywhere I've seen that to improve, where you solve problems doesn't really matter; it's hard work and dedication to solving hard problems that force you to think of new ideas that make you improve.
Now to answer your question, I find that Codeforces values speed more while USACO requires being able to solve harder problems. If you want to go to the IOI, you need both skills, so a combination of these should be good. You can find a lot of great resources online like
BTW, the answer to your question is People care about interviews because it's gives them a job. People care about rating because it measures their performance and a show-off. Why should anyone care about learning if it isn't useful in some way? By useful I mean gives them some rating or job or money or whatever. Everyone doesn't have a be a knowledge freak or a nerd.
When I started competitive programming, I wasn't good so I had little passion. I did it for getting better at programming for some interviews or jobs in general. But as I got better than most people around me, I gained pride in myself and passion for competitive programming.
You would find a lot of CP coders who now do coding even in being job and actually was not passionate when they started. With the increase of their rating, they became passionate. If I get struck in some region, then I might not get interested in that thing anymore.
If you don't enjoy learning there's nothing wrong with that. Doing things for prestige and/or money is just as (more) reasonable then doing things for the sake of learning. Plus, people who care about rating or equivalent usually end up learning more because they have a more set goal to achieve and actually do the stuff necessary to achieve it.
Cong. but why not solving easy problems? sometimes there is something very nice in Div.3 contests, i usually try to full them and then read the editorial even for Div.3 A problem, also solving easy problems will increase your coding speed, try solving them in less than a minute if they are too easy, being able to code fast is important.
Also simple implementations will help you get used to CP, sometimes it happens that you solve Div1.C in a second but you cant bring it to your codes, its because of that you are not fine enough in implementation.
You are definitely right! But some people get used to only solve easy problems and not try to solve harder problems. Solving a few would also be really good idea! Plus, it would train your mind to simplify solutions if it was complicated for Div 2 A/Div 3 A. I only feared that people might get used to solving easy problems so I didn't write it in the blog.
Well, I solved 441 problems in total. Basically, I aim to speedforce problems that have the same rating of mine or a little bit lower and to try as much as I could to solve higher rated problems. This balance brings fast thinking(speedforces), solving harder problems(like div 2 D for me).
7fc3f7cf58