区间选点
AcWing 905. 区间选点
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
struct Range
{
int l, r;
bool operator< (const Range &w)const
{
return r < w.r; //按照右端点从小到大排序
}
}range[N];
int main()
{
int n;
cin >> n;
for(int i=0; i<n; i++)
{
int l, r;
cin >> l >> r;
range[i] = {
l,r};
}
sort(range,range+n);
int res = 0, ed = -2e9;
for(int i=0; i<n; i++)
if(range[i].l >= ed)
{
res++;
ed = range[i].r; //选的点为当前区间的右端点
}
cout << res << endl;
}
区间分组
Acwing 906 区间分组
堆存的是每组右端点的最大值(Max_r),堆顶存的是所有组 Max_r 的最小值,当heap.top() >= t.l时,说明Max_r的最小值都大于或等于当前区间的左端点,那么 t 区间必须重开一个组,否则,把 t 区间加入到Max_r最小值的那组。
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e5+10;
struct Range
{
int l, r;
bool operator< (const Range &w)const
{
return l < w.l; //按照左端点从小到大排序
}
}range[N];
int main()
{
int n;
cin >> n;
for(int i=0; i<n; i++)
{
int l, r;
cin >> l >> r;
range[i] = {
l,r};
}
sort(range,range+n