链接:https://ac.nowcoder.com/acm/contest/322/M
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~99999999999999999999999999999999998,每天HJ都会给他的花浇水,但是他很奇怪,他会浇n(1 <= n <= 2 * 105)次水,每次都会选择一个区间[l, r],(0 <= l <= r <= 106),表示对区间[l, r]的花都浇一次水。现在问你,通过这些操作之后,被浇了i(1 <= i <= n)次水的花的盆数。
输入描述:
输入:第一行一个n,表示HJ的操作次数,接下来的n行,表示每一次选择的浇水区间。
输出描述:
输出:输出n个数字Cnt1, Cnt2……Cntn,(用空格隔开)Cnti表示被浇了i次水的花的盆数。
示例1
输入
复制
3
0 3
1 3
3 8
输出
复制
6 2 1
示例2
输入
复制
3
1 3
2 4
5 7
输出
复制
5 2 0
说明
对于样例1的图形解释
被浇了1次的有:0, 4, 5, 6, 7, 8, cnt1 = 6
被浇了2次的有:1, 2. cnt2 = 2
被浇了3次的有: 3 . cnt3 = 3
保存浇花开始的位置和结束的位置,然后一层for去更新答案即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll a[maxn],b[maxn],c[maxn],sum[maxn];
int main()
{int n;while(cin>>n){memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);a[x]++,b[y+1]++;}ll a1=0,a2=0;for(int i=0;i<=maxn;i++){a1+=a[i];a1-=b[i];sum[a1]++;}for(int i=1;i<=n;i++) printf("%lld ",sum[i]);puts("");}}