FAQ
Here’s our list of compiled answers to most frequently asked questions that beginners ask us.
Q1. How do I get started with CP? - Gaurang Tandon
Answer
In general, you should first get used to the programming language. Spend some time getting familiar with it. Undoubtedly C++ is the best choice, but you can also try exploring python or java. Probably start with C instead of C++ as its also what's taught in CPro first sem.
Once you're done with that, you can start with the book Guide to Competitive Programming: Learning and Improving Algorithms Through Contests by Antti Laaksonen. It uses CSES problemset side by side, which are standard quality problems from all popular categories. Amul also posted the link to USACO guide above, which did not exist 1-2 years ago (so I haven't used it much) but I've heard from multiple people that it is an amazing resource.
Once you're done with its first few basics, you can start giving Codeforces contests, It's alright to not finish even one or two problems at the start, if you look at our graphs from 2-3 years ago we also struggled in our first few contests.
Once you're used to that, you might also start exploring slightly advanced material in CP Algorithms, which would you help solve harder problems.
Once you have basic familiarity with the language, everything after that is just to build your logical skills and efficiency in solving such problems. Again, what helps in remaining consistent and going strong is a community, which we have here, and you can also regularly challenge your friends (in duels/in contests/etc.) which you'll find your seniors often doing.
We'll also hold a intro to CP session for ug1 every year. So, there is no need to hurry. In fact, many of us do not start CP immediately after joining college. (i started nearly 2 months later). I just posted the above in case some of you who have prior coding experience wanted to start early and needed resources.
It is recommended to spend the first few weeks just getting familiar with the syntax of C and doing basic stuff in it, which is also what you guys would be doing in CPro.
Q2. How to improve? - Anurudh Peduri
Answer
Ok, a few thoughts that I have. I usually get asked a lot about how to improve. Might as well share my responses with everyone.
1. Solve harder problems.
2. Use the editorials for help if you get stuck. You don't have to read the entire solution. You can read a bit, get some hints, and try again. and repeat.
3. "Am I wasting a problem by looking up the editorial": No. There are millions of problems out there. The first ones you use will always get "wasted". But understanding complex solutions, and implementing them (even with a lot of help), helps you improve.
4. Always finish coding, even if you fully read the solution elsewhere. Because coding up a hard problem also gives you a better insight to the ideas involved, and helps you internalize it better.
5. Don't worry too much about rating. Rating should be a consequence, not a cause. Don't get disheartened by a few bad performances. Keep your focus on learning and solving.
6. Taking help isn't wrong. You can discuss, and solve together. You can get a full solution from someone else. You can use someone's code as reference. Just make sure you understand it, and try applying it elsewhere to check that.
7. [Personal experience] Attitude/confidence makes a huge difference. Till 3rd year I used to enter contests with the aim to solve 1A and 1B. And I usually was able to within the 2 hours. In 4th year, I decided to make sure I solve 1C, even if it has like 10 solves. And it made a huge difference. I went from averaging around 2050 to averaging around 2350.
(P.s. Rahul Dugar (amnesiac_dusk) told me the same thing)
Q3. How do you work as a team for ICPC? How do teams (in general) go about splitting tasks / questions? - Anurudh Peduri
Answer
Multiple factors:
1. Divide and conquer:
- strong and weak topics: I'm really bad at DP and Arjun is next level at it. On the other hand I'm good at graphs and flows, and Arjun is weak there. (Devansh is next level at everything, but not everyone gets a teammate like him xD)
- speed and implementation skill: try to make the fastest coder code easy probs. And similarly for implementation heavy (but easy) probs.
2. Work together
- discussions: actively discuss hard problems. Just keep brainstorming ideas, and thinking loudly. Even if you aren't able to fully solve it, you'll be able to combine ideas. We usually ping pong off each other, even if we have no clue how to proceed in the beginning. Helps a lot.
- pair programming: try to read and debug each other's codes. It always helps to maintain similar coding styles. Especially if you want multiple people to write parts of solutions. And to debug under pressure.
- general practices: make sure everyone on the team is on the same page. Whether it's implementation details, or using templates or strategy.
- trust: you have to trust your teammates to do the job. They might mess up sometime, but don't be too harsh. You are a team after all. Especially during the contest, if someone is super sure of what they are doing, support them instead of trying to barge in your own ideas.
- communication: this is key. Whatever is on your mind, make sure everyone knows it. Especially when there are multiple problems to solve, but only one PC. Discuss and decide what you think is best. And stick to that, with confidence.
- post contest analysis: it always helps to analyze what exactly happened, and what you got right and wrong during a contest. We usually spend about an hour after each contest analysing. You can re-think your strategy, topic split, etc. And discuss the contest experience itself.
I hope this helps. Of course, emphasizing again: this is subjective, not the only right way.