链接
用树状数组实现差分,对左端点做add(L, value),对右端点做add(R, -value).最后查询的时候是每一个位置的前缀和.
参考代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <functional>
#include <vector>
#include <unordered_map>
using i64 = long long;
constexpr int M = 1e5 + 10;
int tree[M], N;
void add(int x, int value) {
for (int i = x; i <= N; i += (i & (-i))) {
tree[i] += value;
}
}//单点修改
int query(int x) {
int ans = 0;
for (int i = x; i >= 1; i -= (i & (-i))) {
ans += tree[i];
}
return ans;
}//查询前缀和
template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
f *= fu;
}
int main() {
while (1) {
read(N);
if (N == 0) {
break;
}
std::memset(tree, 0, sizeof tree);
for (int i = 1; i <= N; i++) {
int x, y;
read(x), read(y);
add(x, 1), add(y + 1, -1);
}
for (int i = 1; i <= N; i++) {
printf("%d%s", query(i), (i == N ? "\n" : " "));
}
}
return 0;
}