sdnu第2场选拔赛 区间覆盖长度问题

给定若干个区间,将它们合并之后的长度为多少,区间个数为n,(0<n<=100000),区间为[l,r],(10^9<=l,r<=10^9),有多个测试用例


Input

3

1 5

2 4

3 3


Output

4

思路:建立一个结构体存储区间[a,b],然后以结点a为标准进行结构体排序,区间[x,y]初始化为第0个区间从第1个开始逐渐往后进行处理,过程中维护一个当前最大区间[x,y],过程中能合并的话合并并修改[x,y]数组,然后若处理到第i个区间的时候,发现不能与[x,y]合并则记录下当前的[x,y]的长度并废弃,再以第i个区间为基点,[x,y]区间赋值为第i个区间,重复上面的操作维护一个状态数组[x,y]

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
using namespace std;
struct node
{
    long long a;
    long long b;
}c[100010];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<=n-1;i++)
            cin>>c[i].a>>c[i].b;
        long long len=0;
        long long  x=c[0].a,y=c[0].b;
        for(int i=1;i<=n-1;i++)
        {
            if(x<c[i].b&&y>c[i].a)//区间合并条件
            {
                x=min(x,c[i].a);
                y=max(y,c[i].b);
            }
            else
            {
                len+=y-x;
                x=c[i].a;
                y=c[i].b;
            }
        }
        cout<<len+y-x<<endl;
    }
    return 0;
}


你可能感兴趣的:(合并,区间合并)