HDU1255 覆蓋的面積 掃描線

來源:互聯網
上載者:User

好久沒寫掃描線了,今天想拿些資料結構題目練手,在題目分類裡面看到了這題,就拍上了。

掃描線排序離散化,線段樹的區間代表y的腳標,然後對y進行離散化,二分尋找對應的y。

val用來記錄區間被覆蓋的次數,嚴格O(nlogn)的訪問,然後直接掃描一遍就可以了。

對精度要求不高,原來數組開小了,eps設成1e-8就WA了,不知道是資料開到1000不夠還是eps太小。

 

My Code:

 

#include <iostream><br />#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <cmath><br />#include <algorithm></p><p>using namespace std;</p><p>const double eps=1e-6;<br />const int MAX=10100;<br />int n,len;<br />double sum;</p><p>struct Node<br />{<br />int l,r,val;<br />double area;<br />};<br />Node seg[4*MAX];<br />struct Line<br />{<br />//each sub contains two lines, left and right.<br />double x,y1,y2;<br />bool s;//true- left, false - right</p><p>bool operator<(const Line& line) const<br />{<br />return x<line.x;<br />}<br />};<br />Line line[2*MAX];<br />double line_y[2*MAX];</p><p>int Read(double num)<br />{<br />int left,mid,right;<br />left=0;<br />right=len-1;<br />while(left<=right)<br />{<br />mid=(left+right)/2;<br />if(fabs(num-line_y[mid])<eps)<br />return mid;<br />if(num-line_y[mid]>eps)<br />left=mid+1;<br />else<br />right=mid-1;<br />}</p><p>return -1;<br />} </p><p>void Init(int k,int l,int r)//clear<br />{<br />seg[k].l=l;<br />seg[k].r=r;<br />seg[k].val=0;<br />seg[k].area=0;<br />if(l+1<r)<br />{<br />int mid=(l+r)/2;<br />Init(2*k,l,mid);<br />Init(2*k+1,mid,r);<br />}<br />}</p><p>void Update(int k)<br />{<br />if(seg[k].val>1)<br />seg[k].area=line_y[seg[k].r]-line_y[seg[k].l];//calculate area<br />else if(seg[k].r-seg[k].l==1)<br />seg[k].area=0;<br />else<br />seg[k].area=seg[2*k].area+seg[2*k+1].area;<br />}<br />void Insert(int k,int l,int r)<br />{<br />if(seg[k].r-seg[k].l==1)<br />{<br />seg[k].val++;<br />Update(k);<br />return ;<br />}<br />int mid=(seg[k].l+seg[k].r)/2;<br />if(l<mid)<br />Insert(k*2,l,r);<br />if(r>mid)<br />Insert(k*2+1,l,r);<br />Update(k);<br />}</p><p>void Remove(int k,int l,int r)<br />{<br />if(seg[k].r-seg[k].l==1)<br />{<br />seg[k].val--;<br />Update(k);<br />return ;<br />}<br />int mid=(seg[k].l+seg[k].r)/2;<br />if(l<mid)<br />Remove(2*k,l,r);<br />if(r>mid)<br />Remove(2*k+1,l,r);<br />Update(k);<br />}<br />void Add(double x1,double y1,double x2,double y2,int i)//add (x1,y1)-(x2,y2) line set.<br />{<br />int k=2*i;<br />line[k].x=x1;<br />line[k].y1=y1;<br />line[k].y2=y2;<br />line[k].s=1;<br />line[k+1].x=x2;<br />line[k+1].y1=y1;<br />line[k+1].y2=y2;<br />line[k+1].s=0;<br />line_y[k]=y1;<br />line_y[k+1]=y2;<br />}</p><p>void run()<br />{<br />//when input the cubes, use add() to add them.<br />//then sort the array line and line_y.<br />//in here, n is double of the number of cubes.<br />//left and right.<br />//after that, we delete the epactal lines in the set.<br />//then insert the lines into segment tree.<br />//let len is the new range of lines.<br />n*=2;<br />sort(line,line+n);<br />sort(line_y,line_y+n);<br />len=1;<br />for(int i=1;i<n;i++)<br />if(line_y[i]!=line_y[i-1])<br />line_y[len++]=line_y[i];<br />Init(1,0,len-1);<br />sum=0.0;<br />int l,r;<br />//s=delta_x*delta_y<br />for(int i=0;i<n-1;i++)<br />{<br />l=Read(line[i].y1);<br />r=Read(line[i].y2);<br />if(line[i].s)<br />Insert(1,l,r);<br />else<br />Remove(1,l,r);<br />sum+=seg[1].area*(line[i+1].x-line[i].x);<br />}</p><p>printf("%.2f/n",sum);<br />}</p><p>int main()<br />{<br />double x1,x2,y1,y2;<br />int t;</p><p>scanf("%d",&t);<br />while(t--)<br />{<br />scanf("%d",&n);<br />for(int i=0;i<n;i++)<br />{<br />scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);<br />Add(x1,y1,x2,y2,i);<br />}</p><p>run();<br />}</p><p>return 0;<br />}<br />

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.