Блог пользователя Wind_Eagle

Автор Wind_Eagle, история, 2 года назад, По-русски

Привет, Codeforces! Я, как и многие из вас, периодически читаю блоги. В последнее время мое внимание стали привлекать блоги от пользователей с низким рейтингом, которые спрашивают, как им поднять свой рейтинг. Хочу немного рассказать о своем мнении по поводу этих блогов.

Итак, что же их себя представляют эти блоги? Обычно это блог с заголовком что-то вроде "Срочно нужна помощь!" или "Как улучшить рейтинг, помогите!" Когда открываешь этот блог, то видишь максимально подробное описание проблемы, например, такое: "я решил уже 500 задач, а улучшения все нет и нет." или "я решил уже 100 задач с рейтингом >= 1500, а мой рейтинг не увеличивается". А в комментариях им обычно пишут "ты недостаточно решал, решай больше" ну или "решай более сложные задачи". На мой взгляд, это неверно, и вводит таких пользователей в заблуждение. Позвольте объяснить, что я имею в виду.

Итак, представьте, что вы вообще ничего не знаете ни о спортивном программировнии, ни даже об основах олимпиадной математики. Вы в лучшем случае (поскольку многие не делают даже этого) выучили язык программирования на базовом уровне (действительно, кому нужны шаблоны и классы) уровне, например, С++. И вот, вы решили стать спортивным программистом, чтобы пройти собеседование получить удовольствие от решения интересных задач. Представьте себя таким человеком. Представили? Нет, представьте пожалуйста, это важно.

Когда вы представили это, представьте теперь, что у вас вообще нет друзей, которые бы знали, что такое программирование. "Программирование, а? А это съедобное?" Ну я шучу, конечно, но такое вполне может быть, что никто из окружения не увлекается программированием. Итак, теперь вопрос. Как совершенствоваться? "Что за глупый вопрос?" — спросите вы, "конечно же, просто идти и решать задачи!" Просто все подряд, а может быть, и какой-то там ladder (про который я, увы, ничего особо не знаю). Так вот, заявляю: на мой взгляд, это очень вредный совет, который только навредит тому, кто начинает свой путь в спортивном программировании. Вот вы же представили себя новичком? А теперь подумайте: если вы знаете только школьную математику, сможете ли вы решить D2A? Если вам кажется, что сможете, я вам открою секрет: если вы не прирожденный гений спортивного программирования, то едва ли.

Расскажу немного о том, почему. Как может быть видно из моего профиля, я из Беларуси, из города Могилева. В этом славном городе есть славная гимназия номер два, в которой преподает мой замечательный учитель EIK. У нее много олимпиадников, как начинающих, так и весьма опытных, вроде Dmi34, а также куча выпускников, среди которых, например, я, а также еще один международный мастер и международный гроссмейстер. И могу вам сказать: если сейчас взять ее начинающих, то я не уверен, что они сразу за первый год смогли бы решить даже D2A. Объясню, почему.

Все дело в том, что подходить даже к D2A на самом деле надо постепенно (если, конечно, у вас нет опыта в олимпиадах по математике, скажем — тогда решать D2A в целом идея неплохая). Вернемся к нашему мысленному эксперименту — возьмем любую случайную D2A за последние два года.

Абсолютно случайным образом был выбран раунд 672 и задачу А из него (1420A - Сортировка кубов). Подумайте: насколько легко человеку, знающему только школьную математику, решить эту задачу? Например, у нас в университете на факультете проходят небольшой раздел (на одну-две лекции), посвященный перестановкам, и из этих знаний легко решить эту задачу. А вот если вы знаете только школьную математику (и у вас обычная, ничем не примечательная школа), то решить такую задачу будет явно не так уж и просто. На самом деле, понять, что неотсортированный массив может быть отсортирован пузырьком за n * (n-1) / 2 операции не так уж и сложно, если рассуждать логически. Как мне кажется, сложнее показать, что для неотсортированного массива это не выполняется.

Или вот раунд 697, задача А (1475A - Нечетный делитель). Конечно, эту задачу можно решить, просто выписывая на листочке все числа, и найдя закономерность. Но тут уже надо знать, что такое разложение числа на простые множители, знать, что оно единственно и так далее. Вспоминая жадные алгоритмы, могу отметить задачу из раунда 765, задачу А (опять выбрана случайным образом) (1625A - Древняя цивилизация).

Это я все к чему. Для спортивного программирования необходимо знать математику. А вот теперь представьте себе: человек прорешал, скажем, 100 задач А. Учитывайте, что большинство из них не содержат вообще никаких новых и интересных идей, а просто, как принято говорить, ad-hoc. Что же он узнает из этих задач? Я не уверен, но мне кажется, что просто ничего! Он запомнит двадцать идей, но двадцать первая все равно будет другой. Возвращаясь к нашему воображаемому новичку: ему не у кого спросить, некого попросить объяснить. Некому объяснить стандартные идеи и подходы. Ну вот и что остается ему делать, кроме как читерить писать блоги?

А с задачами B, C и D ситуация еще хуже. Чтобы решать их, обычно требуется уже знание стандартных идей. Проблема в том, что для того, чтобы отработать эти стандартные идеи, нужно решать задачи на эти стандартные идеи, а не сразу D2C — D2D. Представьте себе, если бы вы учили дерево отрезков сразу по задаче сложностью 3000. Это не очень хорошо.

Завершая первую часть блога: Codeforces — это точно не место для практики новичков. Если более опытные пользователи могут тренироваться тут, то для новичков это вряд ли подходит. Что делать, я не знаю, а почему не знаю, поясню позже.

Теперь переходим ко второй части. Теперь я хочу объяснить, почему, на мой взгляд, подход решения задач по сложности на Codeforces это плохая идея.

Давайте посмотрим на несколько (опять же, совершенно точно случайно выбранных задач). Сразу скажу: тут будет мое субъективное мнение. Посмотрим на задачи 858B (858B - Какой этаж?) и (996B - Чемпионат мира). Первую я считаю очень простой для своей сложности, а вторую — ну очень уж сложной. Обе задачи я решал довольно давно, но помню лишь, что когда я был специалистом, первую я решил, хоть и с трудом, а вот когда я был кандидатом в мастера, вторая доставила мне серьезных трудностей -- я даже не помню, решил я ее или нет!

Это уже не говоря о том, что система тэгов на Codeforces не очень хороша, и часто сбивает с толку. Например, в теме ДП может попасться задача на префикс-сумму, а во многих задачах тэги ставятся по принципу "вот задача на ДО/ДП/битовые операции. Но ее можно решить потоками. Поставим-ка теги: графы, потоки. О! Еще и тернарный поиск применить можно! Так и поставим!" Так что тэги реально далеко не всегда отражают тему задачи.

Это я все к чему. Тренироваться надо по темам, а не по сложностям. Особенно когда вы еще не так высоко. Не стоит бояться того, что у вас не получаются ad-hoc задачи — главное, чтобы было хорошо со стандартными идеями.

Многие комментаторы, которые пишут "решай больше задач", на мой взгляд, просто (и это нормально) подзабыли, каково это быть серым или зеленым. И это нормально: я тоже не помню, как я решал, будучи внизу. Но, глядя на то, как мой преподаватель год или два дает исключительно стандартные задачи и подходы, я начинаю понимать, что она скорее всего делает все правильно.

Возвращаясь к нашему примеру — откуда такому человеку знать, какие темы стандартные и какие нет? Он максимум может только узнать названия тем. И кстати, видимо, это и объясняется такое количество серых, которые учат декартово дерево и алгоритм Мо — они не совсем понимают, какие вещи нужны на каком уровне. А почему не понимают? На мой взгляд просто потому, что некому объяснить. Поэтому, если ты новичок / ученик и читаешь это, знай — надо изучать подходы, а не алгоритмы. А алгоритмы лучше не учить, а понимать. Наверное, стоит изучить алгоритм тогда, когда хотя бы один/два раза встретится задача, в которой ты можешь довести решение до конца, полностью и самостоятельно, если бы кто-то за тебя написал этот алгоритм. То есть ты придумал все шаги, всю математику, свел задачу к хорошо известному алгоритму — тогда можешь открыть его и попытаться понять. Кстати, если не получается понять, можно пока и выучить — как мне кажется, это нормально. Позже можно вернуться для понимания (когда будет больше опыта). Когда я был специалистом, я не понимал дерево отрезков (правда, я тогда был школьником, причем даже не старшим).

Поэтому, плавно переходя к главной идее этого блога — я не представляю, как можно заниматься без тренера. Конечно, когда все основные идеи изучены, и алгоритмы отточены, двигаться без тренера можно. Но, скажем, до эксперта или даже до кандидата в мастера без тренера будет гораздо тяжелее. Я знаю, что есть много людей, которые занимались сами, и достигли высот. Мне кажется, что вы — это скорее исключение из правила, чем правило. Я очень рад, что у вас все получилось. Но лично я понимаю, что без тренера мой прогресс был бы куда медленнее.

Я знаю, что если люди, которые пришли сюда тренироваться для собеседований. Ребята, это вообще не место для такого. Для этого придумали LeetCode — там есть куча прекрасных задач для подготовки, сам прорешал десяток-другой.

Напоследок: на мой взгляд, Codeforces стоит определиться: он все-таки должен быть тренировочной площадкой для новичков, или он должен быть тренировочным только для более старших званий? Потому что, если он должен быть тренировочной площадкой и для серых/зеленых, то, кажется, это не так. Потому что Educational раунды совсем не Educational, это обычные Div. 2 раунды, которые лишь немного более стандартные в плане идей и подходов. Даже Div. 3 раунды, которые предназначены для серых и зеленых, и то в последнее время опять начали содержать ad-hoc, а не стандартные задачи. Я понимаю, что это сделано для консистентности рейтинга. Но пусть бы действительно были простые задачи для новчиков. В разделе Edu есть задачи на стандартные алгоритмы — поверьте, изучение этих алгоритмов не принесет особой пользы серому или зеленому.

Поэтому, если хочется создать более благоприятную среду для начинающих, сделать отдельные, возможно, нерейтинговые, тренировочные раунды. Я понимаю, что в каждый раунд Codeforces вложены огромные усилия авторов, координаторов и организаторов (сам автор двух раундов и соавтор еще одного). Быть может, поэтому, скорее всего, Codeforces останется таким, какой он и есть. И знаете что? Я буду только рад. Наверняка (но я не знаю точно), есть куча мест, где могут тренироваться новички. Пусть Codeforces остается таким же прекрасным, какой он есть сейчас, с задачами ad-hoc. На мой взгляд, это и делает раунды такими интересными и захватывающими (только пожалуйста, не надо делать все задачи на одну тему. Примеры приводить не буду, но такие есть. Поверьте, это не круто).

Спасибо Codeforces за то, что ты есть!

  • Проголосовать: нравится
  • +268
  • Проголосовать: не нравится

»
2 года назад, # |
  Проголосовать: нравится +195 Проголосовать: не нравится

Many commenters who write "solve more problems" have, in my opinion, simply (and that's okay) forgotten what it's like to be gray or green

In my experience, many commenters who give advice on these threads are grey or green.

»
2 года назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

a question: as a problem setter, would you want at least div2A/B problems be more implementation-heavy ("do-what-it-says Q"), or one-observation-kill questions?

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +22 Проголосовать: не нравится

    As a problem setter, of course implementation heavy, because it is much easier to come up with. One-observation-kill problems are much harder to make. For me, to make D2A is as hard as make D2E.

»
2 года назад, # |
  Проголосовать: нравится +31 Проголосовать: не нравится

I think using USACO Guide is one of the best ways to "learn approaches", also for grays and greens.

»
2 года назад, # |
  Проголосовать: нравится +39 Проголосовать: не нравится

if you take the beginners now, I'm not sure that they could solve even D2A in the first year at once.

wat

So, smoothly passing to the main idea of this blog — I can't imagine how you can practice without a coach.

lol

I understand that you have no personal experience practising without a coach. But now I wonder if having such ridiculously slow progress is precisely caused by practising with a coach? After all, schools take many years to teach pupils some basic math and other subjects. And this is normal, because the compulsory education can't abandon anyone and "a convoy sails with the speed of the slowest ship". However is this really true for fun hobby activities, where people are much better motivated and are able to self-study successfully?

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +19 Проголосовать: не нравится

    I think it has more to do with the fact that having a really good grasp on a basic subject is better than an "overview" of stronger subjects. As such, spending another week or two is better to cement a base in a subject.

    About D2A's — I believe that a lof of the time they are solved faster is due to the intuition that "this should be not hard", and as such everybody tries to make harder-hitting assumptions. For example, (off the top of my head), half of last D2A's I solved fast because I knew that it was an "A" task.

    About a coach — have to disagree. I went with and without a coach, and you can see that that is the difference between march of this year and december. Even if you are well-motivated, you may not know that you lack in a subject, simply because you don't know it exists, and so on.

    But it you have different experiences, please share.

»
2 года назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Wind_Eagle Can you provide any resource/link or some collection of problems based on standard techniques ?

»
2 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

The real answer is "just do USACO training pages".

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +57 Проголосовать: не нравится

    I really do not understand why people still recommend the USACO training pages. Seven years or so ago, that maybe made sense, but for the last five years at least, the USACO training pages have been incredibly out of touch with the current contest meta. The problems are too standard/derive difficulty from implementation rather than observations, and the coverage of topics emphasizes many topics that rarely show up (and never show up until 2000+ level) while omitting lots of topics that are incredibly important (off the top of my head, the most glaring omissions are segtrees/BITs and problems about trees). My impression is that if your goal is to consistently solve e.g. CF Div. 2 A-C's, the USACO training pages are just about the least effective form of practice you could use, short of not practicing at all.

    • »
      »
      »
      2 года назад, # ^ |
        Проголосовать: нравится +17 Проголосовать: не нравится

      Because 90% of grey/greens are too weak mind to actually solve problems instead of skipping the ones that are "too hard". USACO training pages forces you to do that.

      It doesn't matter what the meta is. It is about problem solving and building a mindset of "I have to solve this to improve instead of saying it's too hard and skipping it". Do you think segtree is in div2 A-C?

      My impression is that every random red thinks to just say "solve more problems" and a guy goes off and solves 1000 div2 As and asks why he is grey. And then the red says "oh just solve problems ABOVE your level" and the grey goes off and looks at 100 div2 Cs and solves 30 and says the rest are too hard and 10 contests later wonders why he is stuck in green.

      On the other hand I have never heard of anyone who solved the first 5 chapters who wasn't at least cyan.

»
2 года назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

I honestly relate to this blog so much.I believe my first and most fatal mistake is described on the fourth paragraph(you can see my blogs).Although i am not really sure whether having friends can really help you.At some circumstances,they can help.However,most people i know that does CF do not really care about my struggles.They will just reply me with one syllable word.They might sometimes ignore me and grind with other people :D (probably because i am a depressed kid with little to no capabilities on doing OI problems so they think i am not worth of their time,i mean who knows)

if you are not a born genius in sports programming, you probably can't.

About this,i am not sure whether you are trying to imply that you can not be tourist if you are not meant to,even though you have infinite time and infinite energy.Most people will say that talent is non-existent.

One will remember twenty ideas, but the twenty-first will still be different.

This honestly applies to any level i must say.Especially DP problems.I believe noone can solve every DP problems in existence.

Final words,i must say that in order to improve as a newbie,one must have a suitable environment and full support from others.I believe people should somehow test their mindset on whether they are suitable for it.You know sometimes this community might be a little bit demotivating.One wrong step and everyone will cancel him/her.This should be somewhat painful for newbies.

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +37 Проголосовать: не нравится

    Your profile screams "I like my daily streak and solve easy problems or copy some solution to keep it". I'd be willing to watch a training session of yours over discord at some time just to prove you're not actually solving many of the problems you have AC.

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    If after solving 1200 problems you have only 1200 rating, you are doing something wrong.

»
2 года назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится
  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится

    Главный плюс этого сайта это культурные дискуссии на форумах, всем рекомендую. Много чего узнал.

»
2 года назад, # |
Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

I used to learn algorithms when I was younger, and I didn't have big success in programming (I was quite good at maths tho, so I usually managed to solve something on olympiads). But after some time I decided to start understanding ideas of algorithms, and from that moment my level at programming began to increase rapidly. The main problem of learning algorithms is that you try to find these algorithms in problems,but problems on olympiads and rounds are not just set of different algorithms, they are about ideas and methods. So one of the most important things to do in learning is to stop learning algrorithms and start to discover ideas in standart problems and algorithms.

»
2 года назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

I knew only school mathematics, the existence of Wikipedia, acmp, codeforces. And that was enough for me to become 1600+.

»
2 года назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

I really strongly disagree with the blog and I think this blog just provides the best excuse for green/grey to stay where they are or drop cp. But proving my point would be mostly anecdotal evidence and they would work better I'm a candidate master or at least expert. So, I think I would wait to complete this comment till then.

»
2 года назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

I read the blog and see that getting a coach might actually help and I agree. In my experience, I joined classes before starting cp for 2 months and they only used to teach leetcode problems. Does this count as a coach ?

»
2 года назад, # |
Rev. 2   Проголосовать: нравится +17 Проголосовать: не нравится

Now imagine: someone has solved, say, 100 problems A. Consider that most of them do not contain any new and interesting ideas at all, but just, as they say, ad-hoc. So what will one learn from these problems? I'm not sure, but it seems to me that simply nothing!

No one to explain the standard ideas and approaches.

I can't imagine how you can practice without a coach.

If someone has solved 100 ad-hoc problems, he has improved his skill of solving ad-hoc problems. If during this time he has encountered problems on standard ideas but failed to solve them, he should have read their editorials, made sure he understood the process and ideas behind the solution, with some additional googling on the subject if necessary. So he was introduced to these ideas he lacked, just as he would have been when solving Olympic math or training under a coach supervision, albeit in a non-systematic way. If he hasn't encountered enough problems on standard ideas, well, he didn't learn them, but he progressed along this ad-hoc difficulty range on Codeforces, gained useful experience, and moved closer to standard ideas.

This may not be the most efficient strategy, but I don't see how it might not work for people who do solve div2A from time to time, and I don't think I've added anything that isn't usually suggested. I'm not speaking from experience, I've had both a coach and Olympic math background when I've started programming, but I'd like to understand why you think such training would be hopeless for an average person. Learning Cartesian tree at gray level is another story, I don't think one would see it very often in div2 A-C editorials.

»
2 года назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

I don't see a point in CF becoming a "programming coach" if that's what you want.

There is nothing special about coaching programming, it's just general problem-solving. One needs an ability to reason logically way more than a coach. Unfortunately, most people lack it, and having a coach won't change anything.

Besides, most beginners are not truly interested in problem-solving, and the imaginary people that you are talking about are already an expection and can do just fine without a coach.

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    "I don't see a point in CF becoming a "programming coach" if that's what you want."

    No, of course no :) Where did I say something like that?

    "One needs an ability to reason logically way more than a coach."

    I strongly confirm that it is much better when someone will give you, say, 50 accurately chosen tasks based on standared ideas and methods to teach you this methods, that you will solve 200 random tasks. I think that coaches make education more efficient. They can explain to you something or, as I said earlier, give you some tasks.

    I want to add something to the previous paragraph. Do you really think that soving random tasks is not worse that solving carefully chosen tasks?

    • »
      »
      »
      2 года назад, # ^ |
        Проголосовать: нравится +6 Проголосовать: не нравится

      I am somewhat good at remembering ideas, so it does not make much difference. Let's say I pick a random problem for practice.

      • If it is immediately obvious to me (because I already saw this idea) then I may skip implementing it (altho implementing obvious problems is also useful for speed). This way I don't waste much time on the problem selection process.

      • If it is not immediately obvious then I already consider it interesting. By solving it, I will likely learn something or at least recall something important. Either way, practice time well spent.

      I can see how a coach will save me a little time by discarding boring problems; other than that, I'm not sure what benefits are there.

      • »
        »
        »
        »
        2 года назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        You are already master; and my blog was about users with 1600- rating. To remember basic ideas for them it is better to have someone who can explain and choose some tasks with these basics.

        • »
          »
          »
          »
          »
          2 года назад, # ^ |
            Проголосовать: нравится +14 Проголосовать: не нравится

          Everything is exactly the same for the users with 1600- rating. They are perfectly capable of successfully training without a coach.

          There's just one major risk: loss of motivation and learned helplessness. The number of possible tricks in D2A and D2B problems is reasonably finite. But beginners are going to encounter a lot of unfamiliar tricks in their first contests. This may give them a false impression that whatever they learned in their first contest was "useless", just because this information didn't immediately help in their second contest. Then after the motivation is lost, training becomes much less efficient. And if people don't really believe that solving a problem to learn a new trick is useful, then they are less likely to remember this trick upon encountering it in future contests.

          Other than this, the training process is rather straightforward. It's enough to just participate in contests and upsolve problems. Read editorials. Read comments under the contest announcement/editorial blogs. Post comments to ask questions if anything is not clear. No coach is really needed for that. Sooner or later, the coverage of known tricks will be good enough to quickly solve a large percentage of easy problems in contests.

    • »
      »
      »
      2 года назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      In case you are worried about beginners learning advanced algorithms before it's time, then it should not happen with the random problems practice strategy. Surely there are no 800-rated Mo problems on CF.

      I also think that all ideas that appear in contests at a certain level are useful and worth learning. By forgetting one of them you risk not solving a similar problem later, even if the idea is super rare. In fact, coaching "carefully selected" topics becomes less helpful as the contests become more randomized in this regard.

»
2 года назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

_ ~~~~~ there are plenty of places for newbies to train_ ~~~~~

What are those? Give us some names so that we can train.

  • »
    »
    2 года назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    If you still can't solve D2A problems on Codeforces, then you can give AtCoder Beginner contests and CodeChef Starter contests a try. The easiest problems there don't have any "puzzle" component at all. For example, the yesterday's CodeChef START33 contest included this problem. The last weekend's AtCoder contest included this problem. Such problems are a lot more approachable and maybe you can successfully solve them. When there's no puzzle and it's immediately clear what need to be done, you can work on improving your programming language skills. The blog also mentions LeetCode, but I haven't tried it myself.

»
2 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I followed your advice and tried to solve some standard problems by topics on other website,I have to admit that comparing to solve many ad-hoc problems on codeforces,the former way seems more suitable for me,thank you!