原题:Exhausted?
原题大意
N 个人,M把椅子,每个人都要有椅子坐,第i个人不能做[Li+1,Ri-1]里的椅子,最少要添多少椅子
算法分析
贪心,先按左端点(L)排序,尽量先往左边垒,如果左边垒不下就垒右边,在已经垒好的集合里换一个右端点(R)最小的,最终还没有垒的全放在右端点。
程序代码
#include <bits/stdc++.h>
#define MN 210000
using namespace std;
struct na{int l,r;}p[MN];
bool cmpl(na a,na b){return a.l==b.l?a.r>b.r:a.l<b.l;}
priority_queue<int,vector<int>,greater<int> > q,_q;
int n,m,mmh;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
mmh = n;
for (int i=1;i<=n;i++) cin >> p[i].l >> p[i].r;
sort(p+1,p+1+n,cmpl);
for (int i=1;i<=n;i++)
if (p[i].l==q.size()) q.push(p[i].r),_q.push(q.top()),q.pop();else q.push(p[i].r),mmh--;
for (int i=q.size()+1;i<=m&&!_q.empty();i++) if (_q.top()<=i) _q.pop(),mmh--;
cout << mmh << endl;
}