Level 2B
To advance to the next level, you need to solve all problems (except the contests marked with asterisk).
*Backtracking (recursive search)
I've found some theory texts that will be useful for you, but the topic is indeed complex, and the theory presented below may not cover all the problems. Anyway, as always, think with your own head.
Complexity of algorithms
This is also a very wide topic. There are some links that may be useful for you, but you can also search for more information in the Internet:
Link one,
Link two
There is also a golden rule of complexity that is not mentioned on those links: a typical modern computer performs about 100 million — 1 billion operations per second. So, in order to estimate the running time of your code, substitute the maximal possible $N$ into the complexity formula, and divide by 100 million or 1 billion. The result will be the running time in seconds (very approximate, of course, but still useful). For example, if maximal $N$ is $1000$, then an $O(N^2)$ algorithm will run in ~0.001—0.01 seconds and most probably will fit into time limit. But if maximal $N$ is $100 000$, the runtime will be 10—100 seconds and will get a time limit exceeded outcome. (For python, the number of operations per second is 10-100 times less.) Use this rule to estimate whether a particular algorithm can be used in a particular problem.
Basics of dynamic programming
Basic theory on SOI.ch