jzoj 1792 教主的花園 2018 2 7

2021-08-15 11:52:37 字數 1649 閱讀 5959

description

【問題背景】

lhx教主最近總困擾於前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。

【問題描述】

可以把教主的花園附近區域抽像成乙個正方形網格組成的網路,每個網格都對應了乙個座標(均為整數,有可能為負),若兩個網格(x1, y1),(x2, y2)有|x1 – x2| + |y1 – y2| = 1,則說這兩個網格是相鄰的,否則不是相鄰的。

教主在y = 0處整條直線上的網格設定了一道屏障,即所有座標為(x, 0)的網格。當然,他還要解決他自己與內部人員的進出問題,這樣教主設定了n個入口a1, a2, …, an可供進出,即對於y = 0上的所有網格,只有 (a1, 0),(a2, 0), ……, (an, 0) 可以通過,之外的所有縱座標為0的網格均不能通過,而對於(x, y)有y不為0的網格可以認為是隨意通過的。

現在教主想知道,給定m個點對(x1, y1),(x2, y2),並且這些點均不在屏障上,詢問從乙個點走到另乙個點最短距離是多少,每次只能從乙個格仔走到相鄰的格仔。

input

輸入的第1行為乙個正整數n,為屏障上入口的個數。

第2行有n個整數,a1, a2, …, an,之間用空格隔開,為這n個入口的橫座標。

第3行為乙個正整數m,表示了m個詢問。

接下來m行,每行4個整數x1, y1, x2, y2,有y1與y2均不等於0,表示了乙個詢問從(x1, y1)到(x2, y2)的最短路。

output

輸出共包含m行,第i行對於第i個詢問輸出從(x1, y1)到(x2, y2)的最短路距離是多少。

hint

【資料規模】

對於20%的資料,有n,m≤10,ai,xi,yi絕對值不超過100;

對於40%的資料,有n,m≤100,ai,xi,yi絕對值不超過1000;

對於60%的資料,有n,m≤1000,ai,xi,yi絕對值不超過100000;

對於100%的資料,有n,m≤100000,ai,xi,yi絕對值不超過100000000。

通俗的講,就是乙個平面直角座標系的x軸上只有規定的a[i]的門口才能走,給兩個點,求他們的曼哈頓距離。

可以分三種情況:

如果兩個點在一側的話,直接算就行

如果不在一側,先排序然後二分查詢:

假如能找到乙個入口k使得x1<=k<=x2,那麼結果就是abs(x1-x2)+abs(y1-y2)

找不到就從選擇到x1或者到x2最小的乙個k:

如果k

#include

#include

#include

#include

using

namespace

std;

int n,m,a[100001],ex,ey,tx,ty;

int main()

//b是標記

if (ans>min(abs(a[mid]-ey),abs(a[mid]-ty))*2)

else

}if (b==true) printf("%d\n",abs(ex-tx)+abs(ey-ty));

else

printf("%d\n",abs(ex-tx)+abs(ey-ty)+ans);}}

}

JZOJ 1406 教主的花園

教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡3種樹,這3種樹的高度分別為10,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩棵樹的高度都高或者...

教主的花園

lhx教主最近總困擾於前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。可以把教主的花園附近區域抽像成乙個正方形網格組成的網路,每個網格都對應了乙個座標 均為整數,有可能為負 若兩個網格 x1,y1 x2,y2 有 x1 x2 y1 y2 1,則說這兩個網格是相鄰的,否則不是相鄰的。教主在y 0...

教主的花園

教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡33種樹,這3種樹的高度分別為10,20,3010,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩...