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;
}

posted @ 2024-01-31 11:41  highkj  阅读(9)  评论(0)    收藏  举报