Codeforces Round #587 C. White Sheet(思维+计算几何)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #587 C. White Sheet(思维+计算几何)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
?題意
先給一個白矩陣,再兩個黑矩陣
如果兩個黑矩陣能把白矩陣包含,則輸出NO
否則輸出YES
?思路
計算幾何題還是思維題呢?
想起了上初中高中做幾何求面積的題
這個就類似于那樣
包含的話分兩種情況討論,其他的不包含
①白矩形在一個黑矩形內部
這種情況直接判斷邊界就可以
②白矩形在兩個黑矩形組合的圖形內部
- 首先這個情況的前提是兩個黑矩形必須能連接起來
- 白矩形和兩個黑矩形分別會有重合,重合的地方可能會在此重合,
例如 白矩形(1 1 4 2)? ?黑1矩形(1 0 3 4)? 黑2矩形(2 0 5 3)
? ? ? ?被黑1黑2矩陣聯合包含,與黑1相交面積是粉色區域,與黑2相交面積是綠色區域
? ? ? ?但是粉綠色區域的多算的,白矩陣面積=粉色面積+綠色面積-粉綠面積
?代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct node 5 { 6 ll xl,yl,x2,y2; 7 }a[4],p; 8 9 bool CH(node x,node y )//重合 10 { 11 if(x.xl>=y.xl&&x.x2<=y.x2&&x.yl>=y.yl&&x.y2<=y.y2) 12 return true; 13 return false; 14 } 15 ll XJ(node a,node b)//相交 16 { 17 ll cx1=max(a.xl,b.xl); 18 ll cy1=max(a.yl,b.yl); 19 ll cx2=min(a.x2,b.x2); 20 ll cy2=min(a.y2,b.y2); 21 if(cx1>cx2||cy1>cy2)//不相交 22 23 p=node{cx1,cy1,cx2,cy2};//相交矩形 24 return (cx2-cx1)*(cy2-cy1);//相交面積 25 } 26 27 ///包括NO 不包括YES 28 int main() 29 { 30 for(ll i=1;i<=3;i++) 31 cin>>a[i].xl>>a[i].yl>>a[i].x2>>a[i].y2; 32 33 if(CH(a[1],a[2])||CH(a[1],a[3]))///重合在內部 34 { 35 puts("NO"); 36 return 0; 37 } 38 39 if(XJ(a[2],a[3])<0) ///2 3不相交 40 { 41 puts("YES"); 42 return 0; 43 } 44 45 if(XJ(a[2],a[3])>=0) ///2 3相交 46 { 47 ll s1=XJ(a[1],a[2]); 48 node p1=p; 49 ll s2=XJ(a[1],a[3]); 50 node p2=p; 51 ll s=(a[1].y2-a[1].yl)*(a[1].x2-a[1].xl); 52 s+=max(1ll*0,XJ(p1,p2));///重合處會多算 53 54 if(s1+s2==s) 55 { 56 puts("NO"); 57 return 0; 58 } 59 else 60 { 61 puts("YES"); 62 return 0; 63 } 64 } 65 } 66 67 /** 68 1 1 4 2 69 1 0 3 4 70 2 0 5 3 71 */ View Code?
轉載于:https://www.cnblogs.com/MMMinoz/p/11566721.html
總結
以上是生活随笔為你收集整理的Codeforces Round #587 C. White Sheet(思维+计算几何)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VK Cup 2017 - Round
- 下一篇: centos7 nginx yum 配置