- 将所有区间的左右端点存入数组,并从小到大排序,再去重,遍历数组,若两个相邻元素差值不为1,在数组末尾插入两元素中的最小值加一,再排序一次。
- 遍历原区间,取数组中等于该值的元素位置的下标加1作为离散后的区间端点即可。
for(int i=1;i<=n;++i)
{
scanf("%d%d",&st[i],&ed[i]);
num[con++]=st[i];
num[con++]=ed[i];
}
sort(num,num+con);
con=unique(num,num+con)-num;
int e=con;
for(int i=0;i<e;++i)
{
if(num[i]!=num[i-1]+1)
num[con++]=num[i-1]+1;
}
sort(num,num+con);
for(int i=1;i<=n;++i)
{
int l=lower_bound(num,num+con,st[i])-num+1;
int r=lower_bound(num,num+con,ed[i])-num+1;
}