The efficiency of algorithms plays a central role in competitive programming. In this chapter, we learn tools that make it easier to design efficient algorithms. introduces the concept of time complexity, which allows us to estimate

running times of algorithms without implementing them. The time complexity of an algorithm shows how quickly its running time increases when the size of the input grows.

Two example problems which can be solved in many ways.

In both problems, we can easily design a slow brute force solution, but it turns outthat we can also create much more efficient algorithms.