水题,练习一下树状数组实现区间更新。
对于每个区间,区间左端点+1,右端点的后一位-1,查询每个位置的覆盖次数
#include <cstdio> #include <cstring> const int MAXN = 100005; int N, C[MAXN]; int lowbit( int x ) { return (-x)&x; } void update(int x, int add) { for(int i = x; i <= N; i += lowbit(i)) C[i] += add; return; } int sum(int x) { int ret = 0; for(int i = x; i > 0; i -= lowbit(i)) ret += C[i]; return ret; } int main() { while( scanf("%d", &N)== 1 && N ) { memset(C, 0, sizeof(C)); for(int i = 1; i <= N; i++) { int a, b; scanf("%d%d",&a,&b); update(a, 1); update(b + 1, -1); } for(int i = 1; i <= N; i++) { if ( i > 1 ) putchar(' '); printf( "%d", sum(i) ); } puts(""); } return 0; }