AtCoder ABC 223 E
阿新 • • 發佈:2021-10-18
分析
讓我們先分析,兩個矩形的情況、
不妨假設兩個矩形的面積分別為S和T,如果我們想使兩者不會發生覆蓋,那我們可以輕鬆的得出兩個結論
對於所有的滿足該條件的放置,一定存在一條直線l,它平行於x或y軸,其滿足:
- l不會經過任何一個矩形
- 可以將xy區間拆分為兩部分,每一部分有一個矩形
其中灰色部分是一個矩形S,則若需要找到另一個不發生覆蓋的矩形T。T需要滿足不會同時與兩個紅色部分有交集。
如果該直線l存在,且與x軸平行,則了l的取值\(y=\left \lceil \frac{S}{X}\right \rceil\)。
如果該直線l存在,且與y軸平行,則了l的取值\(x=\left \lceil \frac{S}{Y}\right \rceil\)
接下來,我們來看一下三個矩形的情況、
就像兩個矩形一樣,我們也能證明以下兩個結論、
對於所有的滿足該條件的放置,一定存在一條直線l,它平行於x或y軸,其滿足:
- l不會經過任何一個矩形
- 可以將xy區間拆分為兩部分,其中一部分有一個矩形,另一部分有兩個矩形。
第一步,任取兩個矩形,取得l是滿足分割兩個矩形時的直線的。我們不妨設l為平行於y軸的直線。
若,其中最多隻有一條虛線經過最後一個矩形,則另一條虛線就可以作為分割線l
若同時經過兩條虛線,則需要滿足,藍色區域與任意一個灰色區域都不相交。
因此l需要滿足的條件有
- l需要平行於x軸或y軸
- 同時,需要抉擇,那一部分是有兩個矩形的,解決那一部分的兩個矩形時,可以用剛開始討論的,兩個矩形的情況。
Ac_Code
#include<bits/stdc++.h> using namespace std; typedef long long LL; bool solve2(LL x,LL y,LL s,LL t) { for(int i=0;i<2;i++){ LL len = (s+x-1)/x; if(len<y&&x*(y-len)>=t){ return 1; } swap(x,y); } return 0; } bool solve3(LL x,LL y,LL a,LL b,LL c){ for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ LL len = (a+x-1)/x; if(len<y&&solve2(x,y-len,b,c)) return 1; swap(a,b); swap(b,c); } swap(x,y); } return 0; } int main() { LL x,y,a,b,c; cin>>x>>y>>a>>b>>c; cout<<(solve3(x,y,a,b,c)?"Yes":"No")<<endl; return 0; }