I've been trying to abstract out the activity selection problem from the lens of order theory. For this, I plan on studying the following theorems/algebraic structures:

Naively, the solution goes as follows, which can be tested against CSES' movie festival question

// https://cses.fi/problemset/task/1629int main() {    int n;    cin >> n;    vector<pair<int, int>> ms(n);    for (int i = 0; i < n; ++i) {        cin >> ms[i].first >> ms[i].second;    }    std::sort(ms.begin(), ms.end(), [](pair<int, int> p1, pair<int, int> p2) {        return (p1.second < p2.second) ||               (p1.second == p2.second && p1.first < p2.first);    });    int njobs = 0;    int cur_end = -1;    for (int i = 0; i < n; ++i) {        if (cur_end <= ms[i].first) {            cur_end = ms[i].second;            njobs++;        }    }    cout << njobs << "\n";    return 0;}

§ Explanation 1: exchange argument

§ Explanation 2: posets and interval orders