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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

火星探险

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 火星探险 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

在2051年,若干火星探險隊探索了這顆紅色行星的不同的區域并且制作了這些區域的地圖。現在, Baltic空間機構有一個雄心勃勃的計劃:他們想制作一張整個行星的地圖。為了考慮必要的工作,他們需要知道地圖上已經存在的全部區域的大小。你的任務是寫一個計算這個區域大小的程序。

任務:

l?????????從輸入讀取地圖形狀的描述

2 ? ? ? ?計算地圖覆蓋的全部的區域

3 ? ? ? ?輸出

輸入

輸入第一行包含一個整數N(1<=N<=10000),表示可得到的地圖數目。

以下N行,每行描述一張地圖。

每行包含4個整數x1,y1,x2和y2(0<=x1<x2<=30000,0<=y1<y2<=30 000)。數值(x1,y1)和(x2,y2)是坐標,分別表示繪制區域的左上角和右下角坐標。每張地圖是矩形的,并且它的邊是平行與X坐標軸或Y坐標軸的。

輸出

輸出應該包含一個整數,表示探索區域的總面積(即所有矩形的公共面積)

樣例輸入

2
10?10?20?20
15?15?25?30

樣例輸出

225

1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 using namespace std; 5 const int maxsize = 80010; 6 7 struct node 8 { 9 int st,ed,c; 10 int m;//c為區間被覆蓋的層數,m為區間的測度 11 } ST[maxsize]; 12 struct line 13 { 14 int x,y1,y2; 15 bool s; //s=1表示直線為矩形的左邊,s=0,表示直線為矩形的右邊 16 } Line[maxsize]; 17 18 int y[maxsize],ty[maxsize]; 19 //y[]為矩形與浮點數的對應數組,ty[]為用來求y[]的輔助數組 20 21 void build (int root,int st,int ed) 22 { 23 ST[root].st = st; 24 ST[root].ed = ed; 25 ST[root].c = 0; 26 ST[root].m = 0; 27 if(ed-st>1) 28 { 29 int mid = (st+ed)/2; 30 build(root<<1,st,mid); 31 build(root<<1|1,mid,ed); 32 } 33 } 34 35 inline void update(int root) 36 { 37 if(ST[root].c>0) ST[root].m = y[ST[root].ed-1] - y[ST[root].st-1]; 38 else if(ST[root].ed-ST[root].st==1) ST[root].m=0; 39 else ST[root].m = ST[root<<1].m+ST[root<<1|1].m; 40 } 41 void insert(int root,int st,int ed) 42 { 43 if(st<=ST[root].st && ST[root].ed<=ed) 44 { 45 ST[root].c++; 46 update(root); 47 return ; 48 } 49 int mid = (ST[root].ed + ST[root].st)/2; 50 if(st < mid) insert(root<<1,st,ed); 51 if(ed > mid) insert(root<<1|1,st,ed); 52 update(root); 53 } 54 55 void Delete(int root,int st,int ed) 56 { 57 if(st <= ST[root].st && ST[root].ed<=ed) 58 { 59 ST[root].c--; 60 update(root); 61 return ; 62 } 63 int mid = (ST[root].st + ST[root].ed)/2; 64 if(st<mid) Delete(root*2,st,ed); 65 if(ed>mid) Delete(root*2+1,st,ed); 66 update(root); 67 } 68 int indexs[30010]; 69 bool cmp(line l1,line l2) 70 { 71 return l1.x<l2.x; 72 } 73 74 int main() 75 { 76 int n,num; 77 while(~scanf("%d",&n)) 78 { 79 for(int i=0; i<n; i++) 80 { 81 int x1,x2,y1,y2; 82 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 83 Line[2*i].x=x1,Line[2*i].y1=y1; 84 Line[2*i].y2=y2,Line[2*i].s=1; 85 Line[2*i+1].x=x2,Line[2*i+1].y1=y1; 86 Line[2*i+1].y2=y2,Line[2*i+1].s=0; 87 88 ty[2*i]=y1; 89 ty[2*i+1]=y2; 90 } 91 n<<=1; 92 sort(Line,Line+n,cmp); 93 sort(ty,ty+n); 94 y[0] = ty[0]; 95 //處理數組ty[]使之不含有、重復元素,得到新的數組存放到數組y[]中 96 for(int i=num=1; i<n; i++) 97 if(ty[i]!=ty[i-1]) 98 y[num++] = ty[i]; 99 for(int i=0; i<num; i++) indexs[y[i]] = i; 100 build(1,1,num); 101 long long area =0; 102 for(int i=0; i<n-1; i++) 103 { 104 int l = indexs[Line[i].y1]+1,r = indexs[Line[i].y2]+1; 105 if(Line[i].s) insert(1,l,r); //插入矩形的左邊 106 else Delete(1,l,r); //刪除矩形的右邊 107 area += (long long) ST[1].m * (long long)(Line[i+1].x - Line[i].x); 108 } 109 110 printf("%I64d\n",area); 111 } 112 113 return 0; 114 } 矩形面積并(離散化+掃面線)

?

轉載于:https://www.cnblogs.com/contestant/p/3219739.html

總結

以上是生活随笔為你收集整理的火星探险的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。