[codevs3044]矩形面积求并(线段树+扫描线)
2018-03-07 10:40
323 查看
题目:
我是超链接题解:
这个实数有点点麻烦,STL大法好,照离散不误注意线段树表示全覆盖的范围,那么如果有线段[l,r],我们要去覆盖[l,r-1],覆盖的长度自然就是(r+1)-l
代码:
#include <map> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=80005; int num,delta ; map<double,int>mp; double sum ,ans,ls ; struct hh{double x1,y1,x2,y2;}ma[5005]; struct nc{double l,r,h;int v;}sq[10005]; int cmp(nc a,nc b){return a.h<b.h;} void updata(int now,int l,int r) { if (delta[now]) sum[now]=ls[r+1]-ls[l];/// else if (l==r) sum[now]=0; else sum[now]=sum[now<<1]+sum[now<<1|1]; } void change(int now,int l,int r,int lrange,int rrange,int v) { if (lrange<=l && rrange>=r) {delta[now]+=v; updata(now,l,r); return;} int mid=(l+r)>>1; if (lrange<=mid) change(now<<1,l,mid,lrange,rrange,v); if (rrange>mid) change(now<<1|1,mid+1,r,lrange,rrange,v); updata(now,l,r); } int main() { int n; while (scanf("%d",&n) && n) { ans=0; memset(delta,0,sizeof(delta)); memset(sum,0,sizeof(sum)); num=0; for (int i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&ma[i].x1,&ma[i].y1,&ma[i].x2,&ma[i].y2),ls[++num]=ma[i].y1,ls[++num]=ma[i].y2; sort(ls+1,ls+num+1); int s=unique(ls+1,ls+num+1)-ls-1; for (int i=1;i<=s;i++) mp[ls[i]]=i; num=0; for (int i=1;i<=n;i++) { sq[++num].l=mp[ma[i].y1],sq[num].r=mp[ma[i].y2],sq[num].h=ma[i].x1,sq[num].v=1; sq[++num].l=mp[ma[i].y1],sq[num].r=mp[ma[i].y2],sq[num].h=ma[i].x2,sq[num].v=-1; } sort(sq+1,sq+num+1,cmp); for (int i=1;i<=num;i++) { change(1,1,s,sq[i].l,sq[i].r-1,sq[i].v);//覆盖了sq[i].l,sq[i].r-1的范围,即覆盖到sq[i].r ans+=sum[1]*(sq[i+1].h-sq[i].h); } printf("%.2lf",ans); } }
相关文章推荐
- codevs3044 矩形面积求并(线段数+扫描线+离散化)
- codevs 3044 矩形面积求并
- 矩形面积求并(codevs 3044)
- codevs3044 矩形面积求并
- Codevs P3044矩形面积求并
- 【离散化练习】Codevs3044矩形面积求并
- 【codevs3044】矩形面积求并
- codevs 3044 线段树+离散化+扫描线 (矩形面积并
- 【codevs3044】矩形面积求并&&【POJ1151】Atlantis,第一次的扫描线
- [Codevs] 3044 矩形面积求并(离散化)
- (codevs 3044 矩形面积求并)<可以不用线段树>
- codevs 3044 矩形面积求并 (扫描线)
- 【POJ1177】【HDU1828】【codevs2149】矩形面积周长并
- 3044 矩形面积求并 - Wikioi
- poj 1151 线段树+扫描线(Atlantis矩形面积)
- 【codevs 3044】【HDU 1542】【poj 1151】矩形面积并 线段树+‘扫描线’
- codevs 2149 矩形周长
- UVA 11983-Weird Advertisement-k次以上覆盖矩形面积(线段树+扫描线)
- 【codevs 3044 矩形面积合并】【poj 1151 Atlantis】【hdu 1542 Atlantis】题意&题解&代码(c++)
- poj1151==codevs 3044 矩形面积求并