hdu-1556

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

普通的线段树区间更新,用线段树去输出值,注意输出格式就好了.

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
#define llinf 1e18
#define inf 1e9
const int N=1e5+6;
int n,q,fl;
int sum[N*4],a[N*4],lazy[N*4];
void pushdown(int rt){
    if(lazy[rt]){
        lazy[ls]+=lazy[rt];
        lazy[rs]+=lazy[rt];
        sum[ls]+=lazy[rt];
        sum[rs]+=lazy[rt];
        lazy[rt]=0;
    }
}
void update(int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        sum[rt]+=(r-l+1);
        lazy[rt]+=1;
        return ;
    }
    pushdown(rt);
    int m=(l+r)/2;
    if(L<=m) update(L,R,l,m,ls);
    if(R>m) update(L,R,m+1,r,rs);
}
int query(int l,int r,int p,int rt){//L,R查询的区间,l,r总区间
    if(l==r){
        return sum[rt];
    }
    int ans=0;
    int m=(l+r)/2;
    if(p<=m) ans+=query(l,m,p,ls);
    if(p>m) ans+=query(m+1,r,p,rs);
    return ans;
}
void printf(int l,int r,int rt){
    if(l==r){
        if(fl++>0) printf(" ");
        printf("%d",sum[rt]);
        return ;
    }
    int m=(l+r)>>1;
    pushdown(rt);
    printf(l,m,ls);
    printf(m+1,r,rs);
}
int main(int argc, char * argv[]){
    ios::sync_with_stdio(false);
    while(scanf("%d",&n)!=EOF&&n!=0){
        fl=0;
        me0(sum);
        me0(lazy);
        int t=n;
        while(t--){
            int l,r;
            scanf("%d%d",&l,&r);
            update(l,r,1,n,1);
        }
        printf(1,n,1);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wushengyang/p/11767746.html