1. 程式人生 > >求區間並集

求區間並集

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1010;
struct node
{
    int num;
    int pos;
}sid[maxn];

bool cmp(node a, node b)
{
    return a.num < b.num;
}

int main()
{
    //freopen("in.txt", "r", stdin);
    int n;
    cin >> n;
    int l, r, top = 0;
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d%d", &l, &r);
        sid[top].num = l;
        sid[top++].pos = 0;         ///代表是區間左端點
        sid[top].num = r;
        sid[top++].pos = 1;         ///代表是區間右端點
    }
    int cover = 0;
    int sum = 0;
    sort(sid, sid + top, cmp);
    for(int i = 0; i < top - 1; ++ i)
    {
        if(sid[i].pos == 0)
            cover ++;
        if(sid[i].pos == 1)
            cover--;
        if(cover == 0)
            continue;
        sum += sid[i + 1].num - sid[i].num;
    }
    cout << sum << endl;
    return 0;
}