差分运用,区间覆盖
  • 板块学术版
  • 楼主chenbinggang
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/20 23:58
  • 上次更新2023/11/4 14:00:27
查看原帖
差分运用,区间覆盖
141331
chenbinggang楼主2021/7/20 23:58
#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的下标了

2021/7/20 23:58
加载中...