poj 3277 City Horizon
2013-08-04 09:31
267 查看
链接:点击打开链接
求在同一水平线上的矩形面积。与HDU 1255 覆盖面积有点类似。
求在同一水平线上的矩形面积。与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; }
相关文章推荐
- POJ 3277 City Horizon
- POJ 3277 City Horizon
- poj-3277-City Horizon-离散化+线段树区域更新
- POJ 3277 City Horizon
- poj 3277 City Horizon
- POJ 3277 City Horizon 扫描线+离散化+线段树
- POJ 3277 - City Horizon
- poj 3277 city horizon 线段树
- POJ 3277 City Horizon
- POJ训练计划3277_City Horizon(扫描线/线段树+离散)
- (离散化 + 线段树) poj 3277 City Horizon
- 离散化+线段树 POJ 3277 City Horizon
- poj 3277 City Horizon 线段树
- POJ 3277 City Horizon
- poj 3277 City Horizon
- poj 3277 City Horizon(线段树#2----离散化)
- POJ 3277 City Horizon 线段染色
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
- POJ 3277 City Horizon(线段树+扫描线+离散化)
- poj 3277 City Horizon