2018北大暑校acm演算法訓練課程 矩形分割 二分

2021-08-21 20:54:07 字數 1620 閱讀 2974

總時間限制: 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

2 1 1 2 1

5 1 2 1

樣例輸出

5分析:二分橫線位置,判斷答案(不多說了,這個題和前面的太類似了)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int max_n=100000;

const

int inf = 0x3f3f3f3f;

#define eps 1e-7

//#define kongxiangzhouye

#define _for(i,a,b) for( int i=(a); i<(b); ++i)

#define _rep(i,a,b) for( int i=(a); i<=(b); ++i)

ll x1[10005];

ll x2[10005];

ll h[10005];

ll s[10005];

ll r,n,ans;

ll c(ll x)

return sum;

}int main()

ll l=0;

ll r=r;

while(l2;

if(c(mid)>=0)

r=mid;

else

l=mid+1;

}if(l==r)

ans=l;

while(f(ans)==f(ans+1)&&ans//就是因為這兒,唉

ans++;

cout

0;}

ACM北大暑期課培訓第一天

今天是acm北大暑期課開課的第一天,很幸運能參加這次暑期課,接下來的幾天我將會每天寫部落格來總結我每天所學的內容。好吧下面開始進入正題 今天第一節課,郭煒老師給我們講了二分分治貪心和動態規劃。1.二分主要講了兩個函式 binary search 和 lower bound binary search...

2018多校聯合訓練2

打的慘不忍睹,就過了3題 1004 水題,直接輸出yes就過了,solved by lyy include using namespace std define ll long long int n int main return 0 1010 逆序對 min x,y 隊友一開始wa了4發,給了他模...

2018多校聯合訓練4

過了6題,第一次進入前100名 1012 直接從1走到n solved by wyq include includeint a 100005 int reabs int x int main return 0 1004 和出題人心有靈犀2333 solved by lyy include using...