您的位置:首页 > 其它

poj 3277 City Horizon

2013-08-04 09:31 267 查看
链接:点击打开链接

求在同一水平线上的矩形面积。与HDU 1255 覆盖面积有点类似。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 40010
int line[2*N],a
,b
,h
;
struct node{
int l;
int r;
int c;
}anode[2*N*4];
void bulid(int l,int r,int n){
anode
.l=l;
anode
.r=r;
anode
.c=0;
if(l+1==r)
return;
int mid=(l+r)>>1;
bulid(l,mid,2*n);
bulid(mid,r,2*n+1);
}
void update(int id,int l,int r,int n){
int mid;
if(line[anode
.l]==l&&line[anode
.r]==r){
if(anode
.c<h[id])
anode
.c=h[id];
return;
}
mid=line[(anode
.l+anode
.r)>>1];
if(r<=mid)
update(id,l,r,2*n);
else if(l>=mid)
update(id,l,r,2*n+1);
else{
update(id,l,mid,2*n);
update(id,mid,r,2*n+1);
}
}
long long solve(int h,int n){
if(anode
.c<h)
anode
.c=h;
if(anode
.l+1==anode
.r)
return (long long)(line[anode
.r]-line[anode
.l])*anode
.c;
long long a=solve(anode
.c,2*n);
long long b=solve(anode
.c,2*n+1);
return a+b;
}
int main(){
int i,n,j,len;
while(~scanf("%d",&n)){
for(i=1,j=0;i<=n;i++){
scanf("%d %d %d",&a[i],&b[i],&h[i]);
line[++j]=a[i];
line[++j]=b[i];
}
sort(line+1,line+j+1);
len=unique(line+1,line+j+1)-(line+1);
bulid(1,len,1);
for(i=1;i<=n;i++)
update(i,a[i],b[i],1);
long long ans=solve(0,1);
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: