4136 矩形分割(二分查詢)

2022-05-10 07:37:55 字數 1294 閱讀 2948

總時間限制: 

1000ms

記憶體限制: 

65536kb

描述平面上有乙個大矩形,其左下角座標(0,0),右上角座標(r,r)。大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x=k(k是整數) ,使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左邊的的面積盡可能大。注意:若直線穿過乙個小矩形,將會把它切成兩個部分,分屬左右兩側。

輸入第一行是整數r,表示大矩形的右上角座標是(r,r) (1 <= r <= 1,000,000)。

接下來的一行是整數n,表示一共有n個小矩形(0 < n <= 10000)。

再接下來有n 行。每行有4個整數,l,t, w 和 h, 表示有乙個小矩形的左上角座標是(l,t),寬度是w,高度是h (0<=l,t <= r, 0 < w,h <= r). 小矩形不會有位於大矩形之外的部分。

輸出輸出整數n,表示答案應該是直線 x=n。 如果必要的話,x=r也可以是答案。

樣例輸入

1000

21 1 2 1

5 1 2 1

樣例輸出

5

這個題目有點難度。

1 #include 2

using

namespace

std;34

int area[1000005]; //

每一列的小矩形的面積,如area[0]表示橫座標為0到1之間的小矩形的面積 r最大為1000000

5int r; //

題目中的r

6int n; //

題目中的n78

intmain() 17}

1819

intl,r,mid;

20 l=0

;21 r=r;

22long

long left=0,right=0; //

注意總面積很有可能超出2^31

23while(r>l)

31for(int i=mid; i)

3435

if(r-l==1) else

43 } else

46 } else

50if(left>right) 53}

54}55while(l+1

<=r&&area[l+1]==0)

58 printf("%d"

,l);

59return0;

60 }

OpenJudge 矩形分割 (二分查詢)

03 矩形分割 總時間限制 1000ms 記憶體限制 65536kb 描述 平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須...

矩形分割(二分)

描述 平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左...

題解 矩形分割(二分)

平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左邊的的...