CSES - Shared codeLink to this code:
https://cses.fi/paste/ea80a134fa00a6a1283507/
#include <bits/stdc++.h>
using namespace std;
#define ms(s,n) memset(s,n,sizeof(s))
#define all(a) a.begin(),a.end()
#define present(t, x) (t.find(x) != t.end())
#define sz(a) int((a).size())
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORd(i, a, b) for (int i = (a) - 1; i >= (b); --i)
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define mp make_pair
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef vector<pi> vii;
const int MOD = (int) 1e9+7;
const int INF = (int) 1e9+1;
inline ll gcd(ll a,ll b){ll r;while(b){r=a%b;a=b;b=r;}return a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
bool cmp(pi a, pi b){
return a.se < b.se;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int n, k; cin >> n >> k;
vii a(n);
FOR(i, 0, n){
cin >> a[i].fi >> a[i].se;
}
sort(all(a), cmp);
multiset<int> ms;
int ans =1;
ms.insert(a[0].se);
for(int i = 1; i < n; i++){
//Đi tìm bộ phim đang được xem bởi 1 trong các thành viên
//có thời gian kết thúc <= thời gian bắt đầu của bộ phim hiện tại
auto it = ms.upper_bound(a[i].fi);
//Nếu hiện vẫn còn người chưa xem phim ta cho người đó xem phim này
if(it == ms.begin() && sz(ms) < k){
ms.insert(a[i].se);
++ans;
}
//Nếu cả k người đã đang xem phim và tồn tại 1 bộ phim có thời gian
//kết thúc <= thời gian bắt đầu của phim hiện tại thì ta chọn
//bộ phim có thời gian kết thúc thỏa mãn nhỏ hơn thời gian bắt đầu của bộ hiện
//tại và lớn nhất có thể, để dành những phim có kết thúc sớm hơn
//cho các phim sau
else if(it != ms.begin()){
--it;
ms.erase(it);
ms.insert(a[i].se);
++ans;
}
}
cout << ans << endl;
return 0;
}