POJ 3277 线段树+离散化

题意:

给定n个线段以及没个线段上的高度,求最终所有线段的矩形面积并。

分析:

由于数据范围较大,所以采用离散化,再用每个点进行建树,之前没这么建过线段树,学到了。

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

typedef long long ll;

const int maxn=4e4+10;

ll x[maxn],y[maxn],id[maxn<<1],tree[maxn*8],h[maxn];

void change(int tl,int tr,int i,int l,int r,ll v){
    if(tl>=r||tr<=l) return;
    if(tl<=l&&r<=tr){
        tree[i]=max(tree[i],v);
        return;
    }
    if(tree[i]>=v) return;
    int mid=l+r>>1;
    change(tl,tr,i<<1,l,mid,v);
    change(tl,tr,i<<1|1,mid,r,v);
}

ll query(int i,int l,int r,ll h){
    if(h>tree[i]) tree[i]=h;
    if(l+1==r) return (id[r]-id[l])*tree[i];
    int mid=l+r>>1;
    return query(i<<1,l,mid,tree[i])+query(i<<1|1,mid,r,tree[i]);
}

int main(){
    int n;
    int cnt=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld%lld",&x[i],&y[i],&h[i]);
        id[++cnt]=x[i];
        id[++cnt]=y[i];
    }
    sort(id+1,id+1+cnt);
    cnt=unique(id+1,id+1+cnt)-(id+1);
    memset(tree,0,sizeof tree);
    for(int i=1;i<=n;i++){
        int tx=lower_bound(id+1,id+1+cnt,x[i])-id;
        int ty=lower_bound(id+1,id+1+cnt,y[i])-id;
        change(tx,ty,1,1,cnt,h[i]);
    }
    printf("%lld\n",query(1,1,cnt,0));
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值