N个气球排成一排,从左到右依次编号为1,2,3…N.每次给定2个整数a b(a <= b),从气球a开始到气球b依次给每个气球涂一次颜色。算出每个气球被涂过几次颜色。
分析:区间修改,区间查询 (差分,树状数组)
#include<iostream>
using namespace std;
#define ll long long
ll c[100005];
int N;
int lowbit(int n) {
return n & (-n);
}
void update(ll c[], int i, int val) {
while (i <= N) {
c[i] += val;
i += lowbit(i);
}
}
ll sum(ll c[], int i) {
ll res = 0;
while (i) {
res += c[i];
i -= lowbit(i);
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
while (cin >> N && N != 0) {
for (int k = 1; k <= N; ++k) {
c[k] = 0;
}
for (int k = 1; k <= N; ++k) {
int i, j;
cin >> i >> j;
update(c, i, 1);
update(c, j + 1, -1);
}
for (int k = 1; k < N; ++k) {
cout << sum(c, k) << " ";
}
cout << sum(c, N) << "\n";
}
return 0;
}