#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[400005], num[400005], x[400005];
ll l[200005], r[200005], ans[200005];
int n, m;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>l[i]>>r[i];
r[i]++; //这是必要的
a[2*i]=l[i]; //将全部左右端点存入数组a以备离散化
a[2*i+1]=r[i];
}
sort(a,a+2*n);
m=unique(a,a+2*n)-a;
for(int i=0;i<n;i++)
{
int L=lower_bound(a,a+m,l[i])-a;//差分运用
int R=lower_bound(a,a+m,r[i])-a;
x[L]++;
x[R]--;
}
num[0]=x[0];
for(int i=1;i<m-1;i++)//num[m-1]必为0,可不加
num[i]=num[i-1]+x[i];
for(int i=0;i<m-1;i++)//num[m-1]必为0,可不加
{
ll x=num[i];
ll y=a[i+1]-a[i];
ans[x]+=y;//对应覆盖次数
}
for(int i=1;i<=n-1;i++)
cout<<ans[i]<<" ";
cout<<ans[n]<<endl;
return 0;
题意: 在一维坐标轴上有 n 条线段,线段的左右端点都是整数。请分别计算恰好被覆盖 1 - n 次的整数点的个数。
这串代码怎么实现的?num做了前缀和后怎么成为ans的下标了