区间合并(AcWing.803 )
标签:-- 结构体 一个 介绍 span struct div int while
#include
#include
#include
using namespace std;
typedef pairint, int> PII;
int n;
void merge(vector &interval)
{
vector ans;
sort(interval.begin(), interval.end()); //! pair排序 优先左端点, 再以右端点排序
int st = -1e9-10, ed = -1e9-10; //! 只要比 -1e9 小就可以
for(auto item:interval)
{
if(ed//! 第一段区间一定是 ed
{
if(st!=-1e9-10) ans.push_back({st,ed}); //! 第一次在这里初始化
st = item.first, ed = item.second;//! 第一段区间从这里开始
}
else ed = max(ed, item.second);
}//todo 这个循环结束之后还会剩下一个区间
if(st!=-1e9-10) ans.push_back({st,ed}); //! 如果不是空的 那我们就加上一段
interval = ans;
}
int main(void)
{
ios::sync_with_stdio(false);
cin >> n;
vector interval;
while(n--)
{
int l, r;
cin >> l >> r;
interval.push_back({l, r});
}
merge(interval);
cout endl;
return 0;
}
介绍一种结构体合并区间的算法。
#include
#include
#includeusing namespace std;
const int N = 100010;
struct node{
int start;
int end;
}a[N];
int n;
bool cmp(node c,node d){//结构体排序,保证左区间从小到大排序
return c.start d.start;
}
int main(){
scanf("%d",&n);
for(int i = 0; i "%d%d",&a[i].start,&a[i].end);
sort(a,a+n,cmp);
//for(int i = 0; i
int s = a[0].start,e = a[0].end;
int ans = 1;//必定有一个区间
for(int i = 1; i ){
if(a[i].start e) e = a[i].end;//两种情况,有交集
else if(a[i].start > e) s = a[i].start,e = a[i].end,ans++;//无交集
}
cout endl;
return 0;
}
区间合并(AcWing.803 )
标签:-- 结构体 一个 介绍 span struct div int while
原文地址:https://www.cnblogs.com/zyz010206/p/12348332.html
评论