1. 程式人生 > 其它 >AtCoder ABC 223 E

AtCoder ABC 223 E

原題連結

分析

讓我們先分析,兩個矩形的情況、

不妨假設兩個矩形的面積分別為ST,如果我們想使兩者不會發生覆蓋,那我們可以輕鬆的得出兩個結論

對於所有的滿足該條件的放置,一定存在一條直線l,它平行於xy軸,其滿足:

  • 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,它平行於xy軸,其滿足:

  • 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;
}