omgcoin's blog

By omgcoin, history, 2 years ago, In English,

In August of 2016, I wrote quite detailed post about my training routines.

In very short, in that post, I said that I spend minimum 1.5 hours thinking on a typical Div2 C problem (sometimes even longer and in this case it's usually lasts several days). Then I look at an editorial and often it's not clear to me what problems's authors are talking about. After thinking on an editorial and comments for a few hours, I usually able to understand a solution from comments. As I gathered statistics about my training at that time, it's showed that I solved 26 hard (i.e. Div2 C) problems in period of 93 days. I wrote that I have approximately 1 free hour per day on average.

That post gathered some attention (probably because I've collected detailed statistics about my daily training) and I received several responses from Div1 members including red coders.

Some participants advised to solve 500 problems on Timus OJ since Timus doesn't allow you to look for test cases and don't provide editorials. There is an implicit rule on Timus — "solve it by yourself". On Timus you can train your patience and ability to change view on a problem instead of looking at test cases and editorials. As I understood you have to try to solve a problem, if you don't have a progress then switch to a next problem and return back to problems you couldn't solve after a few days/weeks/months.

I liked that advice and worked in this direction for some time.

It partially helped me to learn how to be more flexible and change view on a problem after getting stuck and getting WA on your submissions.

Sometimes it was very pleasant experience to return back to a problem I couldn't solve a few months ago and quickly write a concise and clean solution which got accepted.

The problem is that my progress on Timus slowed down significantly after I've solved ~160 easiest problems.

I've got another advice (from a person who solved >500 on Timus): switch to a next problem if you don't have any ideas 20 minutes after you read a problem statement.

It didn't work for me because in some cases I couldn't switch to a next problem since I thought I may be so close to solve it and I continued to work hard on a problem for hours, and in other cases I switched to a next problem after ~30 minutes then switched again to another problem after another ~30 minutes and so forth and again in both cases I ended up not solving a single problem in a several hours (usually these hours were during several days).

In another comment to my post I've been told that ~26 solved problems in 93 days is absurdly small quantity. And I need to solve at least 500 hard problems to improve and at my current pace it may take very, very long time.

Since I have strong tendency to linger on a problem way too long, I decided to force myself to look at an editorial for Div2 C problems after I got stuck for more than 30 minutes. Again it didn't work for me since I often couldn't understand an editorial for hours. So attempting to understand an editorial often is as challenging as solving a problem itself.

Of course, after I understood an editorial (usually after sudden strike of aha moment), everything became very simple and straightforward. The problem is that I don't have a time machine to explain it myself a few hours earlier!

Then I tried to go to a next problem anyway if I couldn't understand an editorial in 30 minutes but I found it highly unsatisfying since I just jumped from a problem to a problem without getting anything done.

Some suggested that if I can't understand an editorial for more than an hour then Div2 C problems are way too hard for me at my current level and I should focus on easier problems. I've tried to just solve Div2 B problems to improve my speed (since it's still take some time for me to came up with a correct solution) but after some time I found it quite boring and unsatisfying as I don't learn anything new.

Some commented that I have a hard time understanding an editorial because I'm probably not familiar with some techniques like DP. This is certainly not true because most of the time there is absolutely nothing I didn't know in order to solve a problem I couldn't solve. It's still a complete mystery to me why I can't solve really easy problems for which I know absolutely everything to solve them.

Quite often after I have "aha moment" I wonder why I couldn't came up with a solution since a problem was so simple and straightforward.

I have an impression that some red coders already forgot what it's like to get stuck on easy problems for which you know absolutely everything you to solve them. No wonder why they keep saying — just practice more and learn new techniques.

It clearly doesn't make sense to say "just practice more" since it may take literally forever if you are doing training in a wrong way!

I've spent some time to learn advanced algorithms like KMP, Max-Flow, Segment Tree but it didn't help me since despite of my good understanding I forgot all of them as they do not appear among Div2 C problems.

I also tried to solve harder than Div2 C problems (i.e. Div2 D for example). While it was quite interesting experience it usually take even more time than trying to solve typical Div2 C problems.

Any insights on how to train more efficiently?

P.S. I've already read articles like How to get better?, The 'science' of training in competitive programming, How to come up with the solutions: techniques and others. I think I missed something and as a result I'm training extremely inefficiently.

Read more »

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

By omgcoin, history, 3 years ago, In English,

I spent more than 10 months of consistent training (almost every day, every week) and I have no improvement at all.

Yesterday, my rating is dropped below the level where I was 12th October 2015 (a day of my first contest).

Usually, during contests, I can solve Div2 A for 10-15 minutes, Div2 B for 20-30 minutes, rarely I can solve Div2 C when it's easy. I was at that level in October 2015 and I'm on the same level right now (August 2016).

I still can't solve Div2 C problems and I'm still can't solve problem B quickly without mistakes or being hacked.

So I have zero progress, zero improvement of my problem solving skills after 10 months of almost every day training.

I think there is something definitely wrong with my training method because it's absolutely ineffective.

I'm looking for training advice from experienced participants because I don't want to spent another 10 months and end up exactly at the same level where I was 10 months ago.

My background: I'm working as C/C++ developer since 2009 (early days I was mainly C developer, currently I mostly C++11 developer).

Here is detailed description of my training program:

Every time I'm training on CodeForces, I set up timer for K number of minutes (where K%15 == 0). For me, it's psychologically easier to not to be distracted during specific time frame. Also, I have a journal where I put how much minutes I spent on training every day (including contest time). I keep only "clean" time in my journal, i.e. time when I was not distracted at all. I work in silence and don't listen music during training.

Also, I keep a journal of solved "hard" problems (every entry: day => number of solved problems, usually just one). I consider a problem as hard when the problem level >= Div2 C. I consider hard problem as solved in two cases:

  1. I solved problem without any hint;
  2. I looked at tutorial, then put off problem for a few days, and after try to recreate solution, and make sure that I feel confident that I really understand solution;

I don't consider hard problem as solved if I implement it immediately after I read tutorial or when I don't feel confident that I really understand solution.

I started training on 10th October 2015.

Since 20th February 2016 I keep journal of how much time I spent. Since 11th May 2016 I keep journal of how much hard problems I solved.

Here is my fresh statistics of training:

I spent 89.45 hours in last 93 days (from May 24th till August 24th). It's about 0.96 hours per day in average or 6.73 hours per week in average.

I solved 26 hard problems in last 93 days. It's about 1 hard problem in 3.57 days or 1 problem in 3.44 hours (often combined time for a few days).

Usually, I can train 15, 30 or 45 minutes in the morning before work and 30, 45, 60, 75, 90, 120 minutes in the evening after work.

I'm keeping TODO list of C problems by adding CodeForces rounds to favorites. Usually I add about 20 rounds to favorites (when list is empty) and then work on them starting from down to top of the list till it becomes empty. If I put off problem for a while, I remove from favorites and add it again so that problem will be on top of the list (since I take problems from back of the list).

Typical workflow on problem Div2 C (note that steps could be split into several days):

  1. Trying to solve problem for 1.5 hours (could be split into two days);
  2. Look to tutorial for a hint. It means I can read only first few sentences of tutorial till I get the idea of how to solve problem but don't read entire tutorial. For example, I can read that solution uses two dimensional DP array with states k, m. After that I'm trying to came up with rest of solution on my own;
  3. If I'm still can not solve after another hour, I read tutorial and comments till I understand idea of solution. It could take hour, two, three during several days till I really understand what tutorial is talking about;
  4. When I finally understand solution, I put off this problem for a while (i.e. put to the top of the list). After a while, I check whether or not I really understood solution. If I can easily recreate solution after one or two weeks, then I really understand;
  5. I usually can't solve C problems without hints from tutorial. Sometimes, I can't even solve it with tutorial since I don't understand solution at all. In this case I drop the problem for uncertain period of time (i.e. remove from my TODO list);

So usually, my work on a problem Div2 C can take quite a while. For example:

Day 1: Spend 1.5 hour, can not solve;

Day 2: Look for a hint, try to solve with a hint for another 0.5 hours. Still can not solve;

Day 3: Look at tutorial of the problem and all comments for 1 hour, finally understood solution, put off problem for a few days;

Day 4 (after a few days or weeks): Spend 1 hour to implement solution;

Possible reasons of inefficiency of my training program:

  1. I spent too few hours per day on average. ~1 hour per day is not enough. It will take years till my rating become stable blue;
  2. I spent too much time on Div2 C problems. 26 problems in 93 days is ridiculously low number. I should somehow solve 26 problems in two weeks, not 93 days to get any measurable progress;

Please, help to fix my training program.

P.S. I read CodeForces classic posts about training:

The 'science' of training in competitive programming

How to come up with the solutions: techniques

I know things like zone of proximal development

The problem is that Div2 B is too easy (more than 90% of success) while Div2 C is too hard (low success rate). It's too big gap between B and C.

Read more »

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