AT_abc221_d
前言
我本来和某同学一起 VP 这一场时,都被 D 卡住了,便提议取看一下题解的思路,这不看不知道一看吓一跳,一下就有思路了,然后便有了这一篇题解,但是我竟然发现旁边的同学在对着题解改代码!
思路
我们可以发现 \(a,b\) 都相当的大,所以我们需要离散化一下并使用差分,然后我们就可以用一个 \(now\) 变量存下当前的被覆盖的数量,然后我们要先将每一种操作按照下标排序,然后我们的 \(ans_{now}\) 就加上 \(f_{i+1}-f_i\) 即可,这里的 \(f\) 存的就是位置了。
代码
#include <bits/stdc++.h>
using namespace std ;
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define rep1(i,x,y) for(int i=x;i>=y;i--)
#define fire signed
#define kong putchar(' ')
#define end putchar('\n')
#define in(x) scanf("%lld",&x)
#define lcm(x,y) x*y/__gcd(x,y)
#define w(x) while(x--)
#define il inline
il void print(int x) {
if(x>=10) print(x/10);
putchar(x%10+'0');
}
int n;
pair<int,int> f[400100];
int ans[400100],idx;
fire main() {
in(n);
rep(i,1,n) {
int l,r;
cin>>l>>r;
f[++idx]={l,1};
f[++idx]={l+r,-1};
}
sort(f+1,f+1+idx);
int now=0;
rep(i,1,idx-1) {
now+=f[i].second;
ans[now]+=f[i+1].first-f[i].first;
}
rep(i,1,n) cout<<ans[i]<<" ";
return false;
}

浙公网安备 33010602011771号