For an ACM-ICPC beginner, how should I start?

Most of the answers here point out places where one can solve problems. I'm going to describe an approach to approaching ACM programming contests which is a bit different. My definition of an ACM beginner is someone who has not done an ACM regional contest before and has essentially no competitive programming experience, so I will try to cover more of the details from starting on working ACM problems to competing in a regional contest.

First, get comfortable with one of C++ and Java. You're allowed to use C, C++, or Java - using C is more likely to hinder you in the long run, so get acquainted with one of the other two languages. You should be comfortable enough with the language that you can do some simple things. In particular, you should be comfortable with the following:

  • Reading in data from standard input (the console), or from a file. You mustlearn how to do this, since that's how interaction with the program is done.
  • Basic arithmetic operations with integer numbers as well as real numbers.
  • Basic operations with strings, like extracting a substring or reversing the string entirely.
  • Arrays, iterating over an array, updating elements in an array.
As you get more experience, you can learn about more advanced data structures. Vector, priority queue, map, and set are some of them. 

Once you feel you're comfortable with your programming language of choice, you should get started working on some simple problems. A fair number of resources has been provided. I'm going to highlight Codeforces (can be found at Codeforces). 

This is the site I recommend to all my friends who want somewhere to practice programming, be it competitive programming or casual programming. There are a couple reasons why this site is really nice:

For one, the problems are all high-quality, and the number of times a problem has been solved is a good signal of how easy the problem is. On other sites (the Peking Online Judge found at Welcome To PKU JudgeOnline comes to mind), the number of solves is a very weak signal of how easy a problem is. 

Also, one really nice thing about this online judge that most other judges lack is the ability to see what test case you fail on. At the very beginning of your ACM programming experience, you're going to make some bugs you've never seen before, and being able to look at the test case you failed on can help a lot if you're stuck trying to figure out why your program doesn't work. With that being said, you'll get a lot more out of debugging a problem without looking at the test case, because that's precisely what you'll be doing in a contest setting. If you're stuck debugging for more than an hour or so, take a look at the test case and see why your program doesn't work.

Your next job will probably be to qualify to represent your university at a regional contest. To do this, keep on practicing solving problems. You can use other online judges for additional practice - look at the other answers for other good online judges.

From here, I'll assume you're on your way to regionals.

If you haven't already seen it, understand the ACM-ICPC scoring scheme. In particular, realize that having many wrong submissions is undesirable. It is always worth it to code more slowly and test your code thoroughly before submitting it to avoid having multiple wrong submissions. In an actual contest, nothing is as effective a morale killer as not seeing the Accepted verdict for a program you just submitted.

You can also try to learn scoreboard psychology and do a bit of research on other teams in your region. If a team has solved a problem, that means that the problem is solvable. Ignore wrong submissions to other problems. If a particularly strong team in your region solves a problem, that may not be a good sign that you can do it, but if lots of teams start solving a problem that you haven't solved, you should definitely look at that problem.

Once you're more used to solving contest problems, start working with a team. ACM contests are inherently team contests, and even if you're not necessarily the strongest person on your team, you can definitely still make a contribution (shameless reference to Nick Wu's answer to What it is like to participate in ACM-ICPC contests, knowing that you are the weakest member of your team and that your teammates are doing all of the work for you? Do you feel embarrassed? How do you manage?). When  you start preparing for regionals, pick your team early and do a few virtual contests with them. You may want to do regionals from previous years from your region. Do regionals from other regions (as long as the difficulty is comparable - to put it simply, most regionals in North America are easy, for harder regionals, go looking in Europe or Asia. The Northeastern European Regional Contest (NEERC) is commonly thought of as the hardest regional contest in the world).

In your team, figure out your role among the team members. Do you do better with coming up with solutions, or are you better/faster at coding? Each person should make a contribution that best matches his/her strengths. For example, on my team, I'm the person who is assigned to coding particularly implementation-heavy problems. One of my teammates has stronger math skills, so he focuses on solving more mathematical problems. Having good synergy can be useful, so develop it before and not during an actual contest.

On the day of the contest, don't get stressed out. It's very easy to psych yourself out. Start out slowly, and remember everything you've learned. Enjoy those 5 hours, because those 5 hours are some of the most exhilarating hours you'll ever experience.

You've just completed your first regional contest! Perhaps it ended badly, and you had a program with bugs that you just couldn't fixed. Perhaps it ended well, and you just solved that problem in the final seconds of the contest. In any event, wait eagerly for the results, and keep your fingers crossed that you'll go to World Finals. Even if you don't, don't take it too hard. The world won't end just because you don't go to World Finals. Go do something fun!

Answered by-Nick wu.

Comments

Popular posts from this blog

Forget Efficiency and start solving easier problems

Good schedule to follow for becoming better at competitive programming for beginners

New practice session for all the programmers with me.