区间合并(AcWing.803 )

2021-03-18 17:26

阅读:637

标签:--   结构体   一个   介绍   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


评论


亲,登录后才可以留言!