IGM + How to Be Red
After seven months, this blog finally has an update!
After two good performances back-to-back— 66th place on CodeTON Round 9 and 6th place on Codeforces Round 990— I miraculously ranked up from IM to IGM, gaining a grand total of +347 delta. (I previously dropped from GM to IM after solving ABCDE slowly in Refact.ai Match 1.)
Actually, my first time becoming red was Pinely Round 3 in December 2023, but I didn’t feel like I was qualified to write a “how to be GM” blog yet as I kept swerving between IM ⇄ GM, going down each time I did not perform in my peak condition. However, now that I am IGM, it’s finally time for this long-overdue blog.
So, how to be red?
- Find the Correct Motivation
- It’s Fine to Learn Algorithms
- Keep Your Problem-Solving Brain Warm
- Don’t Just Plan, Execute
- Thinking in Passing
- Set Problems
- You Don’t Need to Be an All-Rounder
- Epilogue
Find the Correct Motivation
Let’s start with a philosophical theory. I believe that there are two kinds of people in the world.
The first group consists of people who are motivated by positive encouragement— if you tell them “You can do it!”, a flame lights up inside them, and they will try their best to succeed. The second group, on the other hand, consists of people who are motivated by negative comments about themselves. When someone tells them that they can’t do something, they will try their best to disprove that person by attempting to master it. (I fall into the second category.)
If you feel like you’ve been receiving a lot of advice of the first type and don’t feel motivated, try hearing “harsher” advice and see how that affects you, and vice versa.
It’s Fine to Learn Algorithms
If you’ve been searching around for tips on how to improve in CP, one of the things you’d possibly hear is:
You don’t need any knowledge of advanced algorithms to advance to (purple/orange/red). Learn (binary search/math/creative thinking) and solve more problems, and you’ll improve.
Generally, this is true. However, don’t interpret this as “avoid learning advanced algorithms”!
If you are curious about how various CS algorithms work or enjoy learning algorithms in general, go ahead! Back in my OI days, I was fascinated with how FFT works and decided to delve deeper, even though it’s outside the IOI syllabus. Even in contests after I graduated from high school, FFT is used as a black-box template that you can copy-paste.
While the current CP meta slightly “punishes” competitors that are better in technical knowledge than creativity, what’s the point of avoiding something that you like just because it’s slightly more inefficient to do it? If you enjoy it, learning algorithms can still improve your skills. Besides, you can also get the enjoyment of solving (read: overkilling) a problem with unintended solutions!
Keep Your Problem-Solving Brain Warm
I ended my OI career with a rating of 2133 (M), and started university.
A whole year later, around November 2023, I don’t feel like I have made any significant improvement. This needs to change, I thought, what have I been doing this whole year? Then I remembered a new site that started hosting online contests (Arenas) with a good UI: solved.ac! solved.ac was a “wrapper” to Baekjoon Online Judge with a lot of gamification. There were “game-like” problem difficulties ranging from Bronze to Ruby, ratings based on how many problems you solved and how difficult the problems were, “classes” that had problem ladders and “rank-up systems”, daily streaks, profile enhancements, and more!
The class system was the main feature that caught my interest. I started solving problems from Class 8 daily, then moving on to Class 9 and 9+. Until the end of 2023, I was obsessed with this training— no matter how tired or busy I was, I would always allocate some time to solve a problem or two each day. Sometimes, I even made sure that my streak continued by solving a bunch of problems in a day right before I knew I’d have several busy days. And just two months after I started, I touched GM for the first time.
Around here as well, I figured out the importance of “warming up”. I don’t mean warming up as in the practice session before an onsite contest, but heating up your brain by doing several problems or contests during the days leading up to a contest. To me, this helps me shift my brain into the right gear to do a contest with peak performance. A daily streak helps a lot so you don’t have to allocate time specifically several days before a contest to keep your brain warm, but of course, not everyone has the time to maintain such a streak. (Now, I don’t have the time to maintain a streak either.)
Don’t Just Plan, Execute
Sometimes, some people ask me to coach them to prepare for the Indonesian NOI/IOI selection camp/ICPC, and I usually agree, given that I have enough time. One question I frequently get is, what’s the best practice method?
Of course, to someone just starting to do CP (i.e. they aren’t yet familiar with C++ or don’t yet know problem-solving paradigms like DP or greedy), I’d point them to my usual resources (for Indonesians, it’s usually TLX courses). However, once you’re “released to the wild” and can be exposed to all sorts of problems, there’s really only one answer:
For me, it’s solved.ac, due to its gamifications, but it might be different for you!
Don’t spend too much time searching for the perfect learning method. Among the methods that you’ve thought of, choose one that you think is most interesting and execute it. Some methods that worked for my students are:
- ThemeCP, where you do 2-3 hour contests of 4 randomly picked CF problems (possibly of a certain topic).
- Using Kenkoooo’s AtCoder virtual contest tool to generate a mashup of AtCoder problems.
- Using the
;gitgud
command with the TLE bot in your favorite CP-related Discord server. - Pick a problem in a rating range with the CF Randomizer.
Thinking in Passing
Evan Chen mentioned that he only practiced when he felt like it, but he often thinks of math in passing. I feel that wiring your brain to think about CP in random idle times helps a lot, especially in the current CP meta where many solutions appear to come out of nowhere. Flashes of inspiration you get might end up solving an old unsolved problem, or even end up as problem ideas for your own problem!
In mid-2023, I moved back from a rented place near my university to my parents’ house and started commuting. Every morning, I would read a random problem from CF or AtCoder. During the commute, I blast some music on my earphones and think about the problem until I arrive at my destination. As I had no paper to scribble on and was forced to visualize everything I thought, I feel like I’m closer to becoming a shape rotator each day. On other days, I’d go out with the goal of setting an interesting problem. Many of my problems are created while commuting.
Of course, it might take some time “gaslighting your brain” to make it enjoy thinking about CP while idling. However, if you genuinely feel interested in CP (or in math or similar subjects), trust me— it’s very worthwhile.
Set Problems
Each year, BINUS— the university I attend— organizes a CP competition for high school students, appropriately named BNPCHS (Bina Nusantara Programming Contest for High School Students). (I still don’t know whether the S stands for School or Students.) I was involved with problemsetting in BNPCHS 2023.
Of course, organizing a contest is not easy. There are many bumps along the way— some of the problems I proposed ended up being easier than intended, and some testers said that the novelty of the problems wasn’t exactly high. And because the testing period was very close to the contest day, the problemsetters were advised to not make major changes to the problems, leaving me unsatisfied with my contribution to the contest.
Since then, I felt the need to create a solo contest to see if my problemsetting skills have improved. It ended up giving birth to TROC 37. While this contest also received harsh criticism (because the problemset was a bit unbalanced and too hard, and some of the problems were annoying to implement), I still felt satisfied nonetheless. I also managed to create a generating function problem!
I encourage everyone to set problems— for example, you can propose a round in CF, CodeChef, or TLX. By being an author, you can familiarize yourself with how problems are made, how test cases are generated, and sometimes even forcing yourself to go out of your comfort zone: instead of finding a solution that simply passes the constraints, when setting a problem you would seek to find the most optimal solution to the problem.
You Don’t Need to Be an All-Rounder
To the question “What is your least favorite type of problem?”, I replied the following:
For the better part of 2023 and 2024, I felt like I’m generally not good at ad-hoc and “riddle”-like problems where you are supposed to make one specific main observation that unlocks the problem. (See, especially, ICPC Jakarta 2023L Palindromic Parentheses, or Pinely Round 4D Prime Xor Coloring). I think my ad-hoc skills are 200-300 rating points below my actual rating at that time. On the other hand, I feel like I got a stronger grip on data structure and combinatorics problems.
You don’t have to master all topics equally. It’s fine to be strong in one topic and weak in another, it’s fine to enjoy a topic and not like another. Statistically speaking, if you keep participating in contests, there’ll eventually be a contest with problems that align with your strengths. Or, in a contest with both kinds of problems, you may be able to solve the problem you like faster, giving you more time for the other problem that you feel is harder.
One day, when you feel you’re strong enough, you’ll be able to overcome your aversion to a topic. This happened to me sometime when I fluctuated between IM ⇄ GM. As my problem preference is essentially the antithesis of AtCoder problems, I started doing virtual contests of AtCoder problem mashups (basically, merging methods 1 and 2 above). It seemed to work, I think, considering how the problem that I first-solved that essentially brought me to IGM is a constructive problem, which I usually dislike.
Epilogue
Being an IGM is still very much surreal to me. While it’s certainly one step closer to being LGM, I think being among the top ~60 people in the world (in CF, at least) is a hellishly difficult achievement, and it might take a lot more time and effort to be there.
Now, what next? Just like errorgorn’s LGM blog, here’s a list of the things I want to achieve in the future, in no particular order:
- LGM in CF.
- Orange, then Red, in AtCoder.
- Going to an onsite final of a major contest (MHC, Yandex Cup, AtCoder WTF, …).
- Actually managing to fit weekly UCup into my schedule, finding a serious team, and going to UCup (semi)finals.
All these goals look near-impossible to my present self. Let’s hope I can prove myself wrong sometime in the future!