日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu1542

發(fā)布時間:2025/3/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu1542 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 /* 2 題意:矩形面積并 3 4 分析:離散+線段樹+掃描線; 5 6 細節(jié):首先線段記錄的信息,len[]表示區(qū)間被覆蓋的長度,cov[]表示當前區(qū)間是否被完全覆蓋 7 其次,線段樹的葉子節(jié)點[l,r]{l==r}的長度是?區(qū)間[l,r]的長度是LX[r]-LX[l]{LX是離散后保存數(shù)據(jù)的地方} 8 那葉子節(jié)點[l,l]的長度不就變成0,顯然這是有問題的 9 10 線段樹的每一個節(jié)點表示一段區(qū)間,[l,r]該區(qū)間表示LX[r+1]-LX[l]的長度 11 1___2___3___4___5離散后的狀況 12 1 2 3 4 線段樹中的每一個節(jié)點 13 14 15 16 */ 17 #include<cstdio> 18 #include<cstring> 19 #include<cmath> 20 #include<iostream> 21 #include<algorithm> 22 #include<cstdlib> 23 #include<vector> 24 #include<string> 25 #define Find(i) lower_bound(LX.begin(),LX.begin()+n1,i)-LX.begin() 26 #define lson l,m,rt<<1 27 #define rson m+1,r,rt<<1|1 28 using namespace std; 29 const int N=200+10; 30 struct Edge{ 31 double hi,ls,rs; 32 int s; 33 Edge(){} 34 Edge(double a,double b,double c,int e):hi(a),ls(b),rs(c),s(e){} 35 bool operator < (const Edge &p)const{ 36 return hi<p.hi; 37 } 38 }; 39 vector<Edge> E; 40 vector<double> LX; 41 double len[N<<2]; 42 int cov[N<<2];//表示區(qū)間是否被完全覆蓋 43 int n,n1; 44 void pushup(int l,int r,int rt){ 45 if (cov[rt]>=1){ 46 len[rt]=(LX[r+1]-LX[l]); 47 }else if (l==r) len[rt]=0; 48 else len[rt]=len[rt<<1]+len[rt<<1|1]; 49 } 50 void update(int L,int R,int v,int l,int r,int rt){ 51 if (L<=l && r<=R){ 52 cov[rt]+=v; 53 if (cov[rt]>=1) len[rt]=(LX[r+1]-LX[l]); 54 else if (l==r) len[rt]=0; 55 else len[rt]=len[rt<<1]+len[rt<<1|1]; 56 return ; 57 } 58 int m=(l+r)>>1; 59 if (L<=m) update(L,R,v,lson); 60 if (m< R) update(L,R,v,rson); 61 pushup(l,r,rt); 62 } 63 64 void work(){ 65 double ret=0; 66 memset(len,0,sizeof(len)); 67 memset(cov,0,sizeof(cov)); 68 for (int i=0;i<E.size();i++){ 69 int l=Find(E[i].ls),r=Find(E[i].rs)-1; 70 if (l<=r) update(l,r,E[i].s,0,n1-1,1); 71 if (E[i].hi!=E[i+1].hi){ 72 ret+=len[1]*(E[i+1].hi-E[i].hi); 73 } 74 } 75 printf("Total explored area: %.2lf\n",ret); 76 77 } 78 int main(){ 79 int cas=0; 80 while (~scanf("%d",&n),n){ 81 E.clear();LX.clear(); 82 for (int i=0;i<n;i++){ 83 double x,y,x2,y2; 84 scanf("%lf%lf%lf%lf",&x,&y,&x2,&y2); 85 E.push_back(Edge(y,x,x2,1)); 86 E.push_back(Edge(y2,x,x2,-1)); 87 LX.push_back(x);LX.push_back(x2); 88 } 89 sort(E.begin(),E.end()); 90 sort(LX.begin(),LX.end()); 91 n1=unique(LX.begin(),LX.end())-LX.begin(); 92 printf("Test case #%d\n",++cas); 93 work(); 94 printf("\n"); 95 } 96 return 0; 97 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Rlemon/archive/2013/05/26/3099850.html

總結(jié)

以上是生活随笔為你收集整理的hdu1542的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。