This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/2_General/4_Practicing.md
2020-06-15 13:00:01 -07:00

6.7 KiB
Raw Blame History

slug title author order
/general/practicing How to Practice Benjamin Qi, William Lin, Eric Wei, Nathan Wang, Nathan Chen, Darren Yao 4

How to practice, when to read editorials (analyses), etc.

Practicing

Reading Editorials

Knowing when to "give up" on a problem and start reading the problem's editorial is challenging. Below are the opinions of various individuals.

Note that "give up" is in quotes, because one still learns when they "give up" and read an editorial!

Benjamin Qi

If you're still coming up with new ideas, keep thinking. Otherwise, you have several options:

  • Look at [part of] the solution. (If CodeForces, look at the tags.)
  • Leave it for a while and do something else if you actually want to solve it on your own.
  • Get a hint from someone else.

I'm impatient, so usually I go with the first option. Sometimes I end up reading an editorial before reading the statement, but idk if this is a good strategy. :/

In any case, if you thought about a problem a lot during a contest but didn't end up solving it, then I don't see any reason not to read the editorial when it comes out (vs. continuing to think about it on your own). Also, you should always implement the solution afterwards!

William Lin

I follow three guidelines (from most important to least important)

  1. Having fun, just doing whatever you feel like doing
  2. Spend about the same amount of time that you would be able to during a real contest
  3. Whether you are making progress or not

Darren Yao

In general, I think its fine to read the solution relatively early on, as long as youre made several different attempts at it and you can learn effectively from the solution.

  • On a bronze problem, read the solution after 15-20 minutes of no meaningful progress, after youve exhausted every idea you can think of.
  • On a silver problem, read the solution after 30-40 minutes of no meaningful progress.
  • IMPORTANT: When you get stuck and consult the solution, you should not read the entire solution at once, and you certainly shouldnt look at the solution code. Instead, its better to read the solution step by step until you get unstuck, at which point you should go back and finish the problem, and implement it yourself. Reading the full solution or its code should be seen as a last resort.

Problems that you practice with should be of the appropriate difficulty. You don't necessarily need to complete all the exercises at the end of each chapter, just do what you think is right for you. A problem at the right level of difficulty should be one of two types: either you struggle with the problem for a while before coming up with a working solution, or you miss it slightly and need to consult the solution for some small part. If you instantly come up with the solution, a problem is likely too easy, and if you're missing multiple steps, it might be too hard.

This and this are two blog posts by Evan Chen that I find quite insightful. They discuss such things as time management, the problem-solving process, and other tips that you may find useful.

Eric Wei

read problem editorials some time after thinking "i have no clue what i'm doing please send help" and before "if i stare at this problem for one minute longer i'm going to punch a hole in my computer", figure out the exact time yourself

Nathan Wang

My personal opinion is that it is okay to give up early when solving CP problems. Sometimes I spend as little as 15-20 minutes on a problem before reading the editorial or at least glancing at solution code. Other times I may spend significantly longer.

CP editorials generally aren't the best (with the exception of USACO editorials, which are pretty good) so I often spend a lot of time trying to understand the solution even after "giving up" and reading the editorial. I think it's good enough to implement the code without having the editorial open.

My justification for why I think it's okay to give up so early is as follows:

  • Getting frustrated and quitting CP for a week is worse than giving up
    • Whenever I feel like I'm really frustrated with a problem, I read the editorial
  • CP editorials are usually difficult to understand, so you will still have to spend a lot of time reading and understanding them
  • You learn a lot by reading editorials
  • If you can solve a problem without reading the editorial, that means you probably could have solved the problem in-contest too, so you didn't actually learn that much. However, if you didn't know how to solve a problem and you read the editorial so now you do, then you've learned a lot more.
    • In other words, reading editorials is a good thing, not a bad thing!

Overall, I would just say to "give up" when you feel like giving up, whether that's in five hours or in 15 minutes :)

Nathan Chen

Read the editorial when you feel like you've stopped making progress; that could be from 1 to 5 hours. However, the most important part about reading the editorial is that you understand the topic and try to think about what similar problems look like. Being generally curious is a good way to practice algorithmic thinking.

Siyong Huang

There's two ways to grow from solving a problem

  1. You learn a new idea/algorithm from it

You learn ideas from problems you cannot solve. This means that you need to read an editorial or someone else's accepted solution. Please try to understand the editorial; it's an important skill to have. You should be re-reading it multiple times and walking through various examples. If this fails, read someone's accepted solution (try to find one that is easy to read, if possible) and figure out what it is doing. If even this doesn't work, ask the author of the solution to explain their logic or specific parts of their code. Trust me, they are extremely happy to help someone who has made an effort to understand the editorial and has used their code as reference.

Furthermore, there have been countless cases where people have asked for help before reading the editorial. We will just link the editorial or repeat it for them, which is pointless.

Finally, hints are extremely overrated. Just read the whole solution. You don't gain anything from reading part of a solution then finishing it out yourself. As long as you implement it in the end, you are still learning the same thing.

  1. Your implementation speed and consistency improves

In terms of implementation speed and consistency, the best way is just to solve a bunch of easy or moderate problems. Try to solve them as fast as possible, as if you were in contest. Perhaps take virtuals or time yourself when solving problems. Whichever you choose, the more problems you solve, the better you will become.