离散化就可以了,代码是以前写的,看起来有些莫名奇妙。
为了防止长度为1的区间对离散化去重造成的影响,这里将区间改为左闭右开区间进行离散化。
#include <bits/stdc++.h>
#define ll long long
#define pll pair<ll,ll>
#define fir first
#define sec second
using namespace std;
const int N = 1e6;
ll num[N],ans[N];
pll seg[N];
int main() {
ios::sync_with_stdio(0);
int n;
cin>>n;
vector<ll>k;
for(int i = 1; i <= n; i++) {
cin>>seg[i].fir>>seg[i].sec;
seg[i].sec++;
k.push_back(seg[i].fir);
k.push_back(seg[i].sec);
}
sort(k.begin(),k.end());
k.erase(unique(k.begin(),k.end()),k.end());
for(int i = 1; i <= n; i++) {
int l = lower_bound(k.begin(),k.end(),seg[i].fir)-k.begin();
int r = lower_bound(k.begin(),k.end(),seg[i].sec)-k.begin();
num[l]++;
num[r]--;
}
for(int i = 1; i < k.size(); i++) num[i]+=num[i-1];
for(int i = 0; i < k.size()-1; i++)
ans[num[i]] += (k[i+1]-k[i]);
for(int i = 1; i <= n;i ++) cout<<ans[i]<<' ';
return 0;
}