区间问题的主要思想就是贪心
重点是先将区间按左(右)边界排序,如何分辨要用左边界还是右边界就是一个大问题
区间合并
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
pair<int,int> q[N];
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
cin>>q[i].first>>q[i].second;
sort(q+1,q+1+n);
int r=q[1].second,ans=1;
for(int i=2;i<=n;i++){
if(q[i].first<=r)
r=max(r,q[i].second);
else ans++,r=q[i].second;
}
cout<<ans;
}
最小支配集和最大独立集
代码相同
具体证明(据说)及其复杂,这里就不说明了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,ll;
pair<int,int> q[N];
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
cin>>q[i].second>>q[i].first;
sort(q+1,q+1+n);
int r=q[1].first,ans=1;
for(int i=2;i<=n;i++){
if(q[i].second>r)
ans++,r=q[i].first;
}
cout<<ans;
}
区间分组
区间分组问题流程与上题差不多,区别就在于要将不重合的区间分组。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct Node{
int l,r;
bool operator<(const Node &W)const{
return l<W.l;
}
}node[N];
int main(){
int n;
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++){
int l,r;
cin>>l>>r;
node[i]={l,r};
}
sort(node,node+n);
priority_queue<int,vector<int>,greater<int> > heap;
heap.push(node[0].r);
for(int i=1;i<n;++i){
if(node[i].l>heap.top())
heap.pop();
heap.push(node[i].r);
}
cout<<heap.size()<<endl;
return 0;
}