bzoj2850 巧克力王國 KD tree

2022-05-20 10:57:43 字數 1250 閱讀 3740

題目描述

巧克力王國裡的巧克力都是由牛奶和可可做成的。但是並不是每一塊巧克力都受王國人民的歡迎,因為大家都不喜歡過於甜的巧克力。對於每一塊巧克力,我們設x和y為其牛奶和可可的含量。由於每個人對於甜的程度都有自己的評判標準,所以每個人都有兩個引數a和b,分別為他自己為牛奶和可可定義的權重,因此牛奶和可可含量分別為x和y的巧克力對於他的甜味程度即為ax + by。而每個人又有乙個甜味限度c,所有甜味程度大於等於c的巧克力他都無法接受。每塊巧克力都有乙個美味值h。現在我們想知道對於每個人,他所能接受的巧克力的美味值之和為多少

輸入第一行兩個正整數n和m,分別表示巧克力個數和詢問個數。接下來n行,每行三個整數x,y,h,含義如題目所示。再接下來m行,每行三個整數a,b,c,含義如題目所示。

輸出輸出m行,其中第i行表示第i個人所能接受的巧克力的美味值之和。

樣例輸入

3 31 2 5

3 1 4

2 2 1

2 1 6

1 3 5

1 3 7

樣例輸出50

4題解kd-tree

樸素的n^2暴力顯然會tle,我們來優化這個過程。

題目要求出某條直線下方的所有點的權值和,不過看做直線並沒有什麼用。

考慮,如果能夠使得某一些點都符合條件或都不符合條件,那麼就可以降低查詢的時間。

所以我們使用kd-tree來維護平面上的點。查詢時,判斷一下區域內的點是否都滿足條件或都不滿足條件,可以減去大量時間。

不過時間複雜度上界貌似還是o(n^2)的

估價函式需要分4種情況討論

#include #include #define n 50010

using namespace std;

typedef long long ll;

struct data

a[n];

int d , root;

bool cmp(data a , data b)

void pushup(int k , int x)

int build(int l , int r , int now)

int getdis(int k , ll x , ll y , ll z)

else if(x < 0 && y >= 0)

else if(x >= 0 && y < 0)

else

return 0;

}ll query(int k , ll x , ll y , ll z)

int main()

bzoj2850 巧克力王國

description 巧克力王國裡的巧克力都是由牛奶和可可做成的。但是並不是每一塊巧克力都受王國人民的歡迎,因為大家都不喜 歡過於甜的巧克力。對於每一塊巧克力,我們設x和y為其牛奶和可可的含量。由於每個人對於甜的程度都有自己的 評判標準,所以每個人都有兩個引數a和b,分別為他自己為牛奶和可可定義的...

Bzoj2850 巧克力王國

time limit 60 sec memory limit 512 mb submit 505 solved 204 歡過於甜的巧克力。對於每一塊巧克力,我們設x和y為其牛奶和可可的含量。由於每個人對於甜的程度都有自己的 評判標準,所以每個人都有兩個引數a和b,分別為他自己為牛奶和可可定義的權重,...

bzoj2850 巧克力王國

以x和 y作為座標建立 kdtree 然後維護某一棵子樹內的美味值之和,如果同一顆子樹的四個角的甜味都小於 h,那麼就可以直接累加進去。雖然這樣的最壞時間複雜度仍然是 o n 但可以卡過去。1 include2 using namespace std 3 define n 50005 4 defin...