题目描述
HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~99999999999999999999999999999999998,每天HJ都会给他的花浇水,但是他很奇怪,他会浇nn(1≤n≤2∗1051≤n≤2∗105)次水,每次都会选择一个区间[l,r][l,r],(0≤l≤r≤1060≤l≤r≤106),表示对区间[l,r][l,r]的花都浇一次水。现在问你,通过这些操作之后,被浇了ii(1≤i≤n1≤i≤n)次水的花的盆数。
输入
第一行一个nn,表示HJ的操作次数,接下来的nn行,表示每一次选择的浇水区间。
输出
输出nn个数字Cnt1,Cnt2,…,CntnCnt1,Cnt2,…,Cntn,(用空格隔开)CntiCnti表示被浇了ii次水的花的盆数。
样例输入
样例一
3
0 3
1 3
3 8
样例二
3
1 3
2 4
5 7
样例输出
样例一
6 2 1
样例二
5 2 0
题目分析
这个题数据规模使用差分约束完全可以过,但是我就是要用map<int,int>::iterator装一下(doge
map<int,int>iterator迭代器的一种,可以提供统一的迭代方式,他会把map<int,int>dp中dp的数据做两个地址前一个是first,后一个是second;有点就是可以省时,只会访问已有数据;
AC代码
#include<bits/stdc++.h>
using namespace std;
map<int,int>dp;//差分数组可以看作int dp[int];
int a[200010];//用来储存浇过i次的花盆数
int main()
{
int n,l,r;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d%d",&l,&r);
dp[l]++; dp[r+1]--;//一维差分的使用
}
map<int,int>::iterator it;//对迭代器的指明
it=dp.begin();
int t=it->first,tt=it->second;
//t来指代当前花盆编号
//tt来指代当前花盆被浇过的次数
it++;//对第一个数据初始化
for(it;it!=dp.end();it++){
a[tt]+=it->first-t;
//对次数为tt的连续段的计数
t=it->first;
tt+=it->second;
//更新t和tt;
}
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
//依次输出
return 0;
}