算法 区间合并

将所有存在交集的区间合并,将其并集作为一个新的区间

模板

void merge(vector&segs)

{

  vectorres;

  sort(segs.begin(),segs.end());

  int st=-2e9,ed=-2e9;

  for(auto seg:segs)

  if(ed

  {

    if(st!=-2e9)

      res.push_back({st,ed});

    st=seg.first,ed=seg.second;

  }

  else

  ed=max(ed,seg.second);

  if(st!=-2e9)

  res.push_back({st,ed});

  segs=res;

}

边界

可以特殊规定,两个区间只有端点相同,也可以合并为一个区间

例题:区间合并

输出合并完成之后的区间个数

例如:[1,3]和[2,6]可以合并为一个区间[1,6]

输入格式

第一行包含整数n

接下来的n行,每行包含两个整数l和r

输出格式

共一行,包含一个整数,表示合并区间完成之后的区间个数

数据范围

1<=n<=100000

-10e9<=li<=ri<=10e9

输入样例

5

1 2

2 4

5 6

7 8

7 9

输出样例

3

解题思路

  1. 按区间左端点排序
  2. 扫描整个区间,在扫描的过程中,将所有有交集的区间进行合并

每次维护一个当前的区间,左端点[st],右端点[ed]

第二个区间与当前的关系:

  • 在内部 ——>更新完之后不变
  • 有交集——>st不变,第二个区间的ed变成新的ed
  • 没交集也不在内部——>将当前维护的区间可以放在答案中,第二个区间可更新为当前维护的区间
#include
#include
#include
using namespace std;
typedef pairPII;
const int N=100010;
int n;
vector segs;
void merge(vector &segs) //区间合并
{
     vector res; //答案,存合并之后的结果
     sort(segs.begin(),segs.end()); //将所有区间排序,pair排序时,优先以左端点排序,再以右端点排序
     int st=-2e9,ed=-2e9; //设置边界值,即负无穷到正无穷
     for(auto seg:segs)
          if(ed>n;
     for(int i=0;i>l>>r;
          segs.push_back({l,r});
     }
     merge(segs); //区间合并模板
     cout<

你可能感兴趣的:(算法,算法)