描述
平面上有乙個大矩形,其左下角座標(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
預處理一下,開兩個陣列記錄某線左右各有多少。記得用long long
2小矩形只有乙個而且寬為1時,答案是r而不是小矩形的右邊x座標
3二分及預處理
4用mid模擬答案,合符輸出,不合符根據條件選取左右區間再次二分
#include#include #include #include #define p 10001
using namespace std;
struct nodenodes[p];
int r,n;
long long cha;
int mid,lleft,rright;
long long check(int mid)
else
else}}
cha=larea-rarea;
return cha;
}int zhixian()
return lleft;
}int main()
if(n==1&&nodes[n-1].w==1)
int aa=zhixian();
while(check(aa)==check(aa+1)&&aaaa++;
printf("%d\n",aa);
}
題解 矩形分割(二分)
平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左邊的的...
OpenJudge 矩形分割 (二分查詢)
03 矩形分割 總時間限制 1000ms 記憶體限制 65536kb 描述 平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須...
4136 矩形分割(二分查詢)
總時間限制 1000ms 記憶體限制 65536kb 描述平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的...