HDU 1556 Color the ball 线段树模板题

来源:互联网 发布:平底皮鞋女款淘宝 编辑:程序博客网 时间:2024/06/04 19:31
#include <stdio.h>#define ll long long#define lson l, m, rt<<1#define rson m + 1, r, rt<<1|1#define root 1, N, 1const int maxn = 100005;ll add[maxn<<2];ll sum[maxn<<2];void pushUp(int rt){    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void pushDown(int rt, int m){    if(add[rt]){        add[rt<<1] += add[rt];        add[rt<<1|1] += add[rt];        sum[rt<<1] += add[rt] * (m - (m >> 1));        sum[rt<<1|1] += add[rt] * (m>>1);        add[rt] = 0;    }}void build(int l, int r, int rt){    add[rt] = 0;    if(l == r){        sum[rt] = 0;        return;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushUp(rt);}void update(int L, int R, int c, int l, int r, int rt){    if(L <= l&&r <= R){        add[rt] += c;        sum[rt] += (ll)c * (r - l + 1);        return;    }    pushDown(rt, r - l + 1);    int m = (l + r) >> 1;    if(L <= m) update(L, R, c, lson);    if(m < R) update(L, R, c, rson);    pushUp(rt);}ll query(int L, int R, int l, int r, int rt){    if(L <= l&&r <= R){        return sum[rt];    }    pushDown(rt, r - l + 1);    int m = (l + r) >>1;    ll ret = 0;    if(L <= m) ret += query(L, R, lson);    if(m < R) ret += query(L, R, rson);    return ret;}int main(){    int a, b, N;    while(scanf("%d", &N) != EOF)    {        if(N == 0) break;        build(root);        for(int i = 0;i < N;i++)        {            scanf("%d %d", &a, &b);            update(a, b, 1, root);        }        for(int i = 1;i <= N;i++)            printf("%lld%c", query(i, i, root), i==N?'\n':' ');    }}

0 0