http://acm.hdu.edu.cn/showproblem.php?pid=1556

(1)延迟更新:pushdown()函数,记得在所有的查询、更新函数中都要使用到。这里用到懒惰标记mark[]数组。

(2)很基础的题,1A。

具体代码:

View Code
#include<stdio.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn=101000;
int n;
int mark[maxn<<2], sum[maxn<<2];
void pushdown(int rt, int n)
{
    if(mark[rt])
    {
        mark[rt<<1]+=mark[rt];
        mark[rt<<1|1]+=mark[rt];
        sum[rt<<1]+=mark[rt]*(n-n/2);
        sum[rt<<1|1]+=mark[rt]*(n/2);
        mark[rt]=0;
    }
}
void pushup(int rt)
{
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l, int r, int rt)
{
    mark[rt]=0;
    sum[rt]=0;
    if(l==r) return ;
    int m=l+r>>1;
    build(lson);
    build(rson);
}
void update(int L, int R, int l, int r, int rt)
{
    if(L<=l&&r<=R)
    {
        mark[rt]++;
        sum[rt]+=r-l+1;
        return ;
    }
    pushdown(rt, r-l+1);
    int m=l+r>>1;
    if(L<=m) update(L, R, lson);
    if(R>m) update(L, R, rson);
    pushup(rt);
}
void search(int l, int r, int rt)
{
    if(l==r)
    {
        if(l!=1) printf(" %d", sum[rt]);
        else printf("%d", sum[rt]);
        return ;
    }
    pushdown(rt, r-l+1);
    int m=l+r>>1;
    search(lson);
    search(rson);
}
int main()
{
    while(scanf("%d", &n)!=EOF, n)
    {
        build(1, n, 1);
        for(int i=1;i<=n;i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            if(a>b) {int x=a;a=b;b=x;}
            update(a, b, 1, n, 1);
        }
        search(1, n, 1);
        printf("\n");
    }
    return 0;
}