Description
给你N个区间,分别记为[li,ri],li为左端点,ri为区间长度
现在问你:
有多少个点正好被1个不同区间覆盖
有多少个点正好被2个不同区间覆盖
......
有多少个点正好被n个不同区间覆盖
Format
Input
一行给出数字N
接下来N行,给出[li,ri]
N<=2e5
li,ri<=1e9
Output
输出1行,N个数字
Samples
输入数据 1
3
1 2
2 3
3 1
Copy
输出数据 1
2 2 0
思路
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000111],b[10101010],c[1001111],d[1001111];
map<long long,long long> mp;
long long g[1001111];
int main(){
vector<long long> v;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
mp[a[i]]+=1;
mp[a[i]+b[i]]-=1;
//cout<<a[i]<<" "<<a[i]+b[i]+1<<endl;
v.push_back(a[i]);
v.push_back(a[i]+b[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()), v.end());
//v.push_back(-1);
//cout<<v[2*n]<<endl;
for(int i=0;i<v.size();i++){
//cout<<v[i]<<" "<<mp[v[i]]<<endl;
c[i+1]=c[i]+mp[v[i]];
if(i!=v.size()-1) d[c[i+1]]+=max(v[i+1]-v[i],(long long)0);
else d[c[i+1]]+=(long long)1;
//cout<<v[i+1]-v[i]<<endl;
}
for(int i=1;i<=n;i++){
cout<<d[i]<<" ";
}
return 0;
}