由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求助於clevow了。你還能幫助clevow嗎?
john的牛場和規劃的浴場都是矩形。浴場要完全位於牛場之內,並且浴場的輪廓要與牛場的輪廓平行或者重合。浴場不能覆蓋任何產奶點,但是產奶點可以位於浴場的輪廓上。
clevow當然希望浴場的面積盡可能大了,所以你的任務就是幫她計算浴場的最大面積。
輸入檔案的第一行包含兩個整數l和w,分別表示牛場的長和寬。檔案的第二行包含乙個整數n,表示產奶點的數量。以下n行每行包含兩個整數x和y,表示乙個產奶點的座標。所有產奶點都位於牛場內,即:0<=x<=l,0<=y<=w。
輸出檔案僅一行,包含乙個整數s,表示浴場的最大面積。
10 1041 1
9 11 9
9 9
80
各個測試點1s
0<=n<=5000
1<=l,w<=30000
winter camp 2002
【題解】
懸線法演算法1模板題
具體的過程就不說了,說幾種特殊的情況
1、當前點在邊界之外:直接計算當前的極大子矩形的值,不改變上線邊界
2、當前點和左邊界的點行相同:更新上下邊界時哪個近更新哪個
3、在整個矩形的四個頂點處各放乙個點
【**】
#include#include#include#includeusing namespace std;
struct hptemp[5050];
int l,w,x,y,n,ans,tot,up,down;
int cmp(hp a,hp b)
int main(){
scanf("%d%d",&l,&w);
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d%d",&x,&y),temp[++tot].x=x,temp[tot].y=y;
temp[++tot].x=0,temp[tot].y=0; temp[++tot].x=0,temp[tot].y=w;
temp[++tot].x=l,temp[tot].y=0; temp[++tot].x=l,temp[tot].y=w;
sort(temp+1,temp+tot+1,cmp);
for (int i=2;i<=tot;++i)
ans=max(ans,(temp[i].x-temp[i-1].x)*w);
sort(temp+1,temp+tot+1,cmp1);
for (int i=1;i=up&&temp[j].x<=down){
ans=max(ans,(temp[j].y-temp[i].y)*(down-up));
if (temp[j].xtemp[i].x) down=temp[j].x;
else if (temp[j].x==temp[i].x){
if (temp[j].x-up=up&&temp[j].x<=down){
ans=max(ans,(temp[i].y-temp[j].y)*(down-up));
if (temp[j].xtemp[i].x) down=temp[j].x;
else if (temp[j].x==temp[i].x){
if (temp[j].x-up
Wc2002 奶牛浴場
懸線法模板題,見上文 include include include include include using namespace std int ans,n,m,z,cnt struct pointp 5050 int cmp1 const point a,const point b for i...
洛谷 P1578 WC2002 奶牛浴場
這樣做是否將所有的極大子矩形都列舉過了呢?可以發現,這樣做只考慮到了左邊界覆蓋乙個點的矩形,因此我們還需要列舉左邊界與整個矩形的左邊界重合的情況。這還可以分為兩類情況。一種是左邊界與整個舉行的左邊界重合,而右邊界覆蓋了乙個障礙點的情況,對於這種情況,可以用類似的方法從右到左掃瞄每乙個點作為右邊界的情...
18 03 20 vijos1055奶牛浴場
由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求助於cle...