【问题描述】给定坐标轴上的 n 个区间段,每个段的端点为整数坐标。有些段可以是一个点,可以彼此相交、相互嵌套,甚至重合,对于任意区间,0≤li ≤ ri≤6×105。 任务如下:对于每个 k ∈[1..n],计算被 k 个区间段覆盖的整数坐标点的个数。点 x被端点为 li 和 ri 的区间段覆盖,当且仅当 li≤ x ≤ri。
【输入形式】 输入的第一行为一个整数 n(1≤ n ≤ 2⋅ 105),区间段的个数。 接下来的 n 行,每行一个整数对 li 和 ri,表示第 i 个区间的端点。
【输出形式】 输出 n 个用空格分隔的整数cnt1、cnt2、...、cntn,这里 cnti 为被 i 个区间覆盖的点的个数。
【样例输入1】
3
0 3
1 3
3 8
【样例输出1】
6 2 1
【样例输入2】
3
1 3
2 4
5 7
【样例输出2】
5 2 0
【样例说明】
样例1描述如下:
坐标点0、4、5、6、7、8被1个区间段覆盖,点1、2被2个区间段覆盖, 点3倍3个区间段覆盖。
样例2描述如下:
坐标点1、4、5、6、7被1个区间段覆盖,点2、3被两个区间段覆盖,每有点被3个区间段覆盖Points
【解题思路】
第一列对应数组a[n],第二列对应数组b[n],c[i-1]表示被i个区间覆盖的整数个数
求出区间内每个数被单个区间囊括的总次数即可
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
long int I,i,n,k1=2000000000,k2=-2000000000;
cin>>n;
int*c=new int[n];
long int*a=new long int[n];
long int*b=new long int[n];
for(i=0;i<n;i++)
{
c[i]=0;
cin>>a[i]>>b[i];
k1=min(k1,a[i]);
k2=max(k2,b[i]);//通过k找出多个区间所囊括的整数范围
}
for(;k1<=k2;k1++)
{
i=0;
for(I=0;I<n;I++)
{
if((a[I]<=k1)&&(k1<=b[I]))
i++;//一个数被囊括的区间次数
else
i=i;
}
c[i-1]++;
}
for(i=0;i<n;i++)
cout<<c[i]<<" ";
return 0;
}