巧克力王國

2022-09-20 17:51:10 字數 1128 閱讀 1399

link

可以認為是k-d樹模板題。當然這只是不帶修改的k-d樹,帶修的以後寫了再說。

作為一篇學習筆記,先介紹一下什麼是k-d樹。要明白一點,即k是乙個變數,用來指代此資料結構處理和維護的空間維數,比如要維護平面上的點或者二元組集合那麼就應該叫做2-d樹(不然真的以為是kbd卡丹樹嗎,那樣叫實在有點**)。接下來說一下它的思想。它的本質就是對於乙個nk維空間進行分治維護,相當於改良優化後的k維樹狀陣列(當然它們有很多地方是不一樣的)。哪e2-d樹來說,它考慮的是把平面分割成乙個個矩形,每個節點對應乙個矩形,隨著樹的遞迴建造矩形被越分越小最後成為乙個單點。由於每個節點是乙個矩形,那麼就可以考慮把這個矩形當成乙個整體進行詢問和修改,具體方式看題。最後,如果帶插入的話可能會導致樹的結構失衡,此時就需要使用替罪羊一樣的方式進行拍扁重建,當然那都是後話了。

考慮到這道題,本質上它就是要詢問滿足\(ax+by的點\((x,y)\)的個數。很顯然前面的表示式相當於乙個半平面,而乙個矩形只有三種情況,全不在半平面中全在以及一部分在。前兩種情況可以直接看成乙個整體累加答案,後面那種情況遞迴處理就可以了。複雜度……應該是\(o(nlogn)\)吧,畢竟它有分治在裡面的嘛。

code:

#include#include//#define zczc

#define ll long long

using namespace std;

const int n=50010;

const int maxn=1e9;

inline void read(int &wh)

while(w<='9'&&w>='0')

wh*=f;return;

}inline int min(int s1,int s2)

ll ans;int aa,b,c;

inline bool in(int x,int y)

inline int inn(int wh)

void solve(int wh)

#undef lc

#undef rc

signed main()

int root=build(1,m,true);

for(int i=1;i<=n;i++)

return 0;

}

bzoj2850 巧克力王國

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

Luogu4475 巧克力王國

luogu 平面上有 n 個點,每個點 x i,y i 價值為 w i m 次詢問,每次給出 a i,b i,c i 求滿足 a ix b iy的點的總價值。n,m le50000 正解貌似是 o n log n 我只會 kdt qaq 直接暴力就行了,每到乙個結點判斷是否可以直接返回 交集為空 全...

kd tree bzoj2850 巧克力王國

分四種情況討論 a,b 0 a,b 0 a 0,b 0 a 0,b 0 然後每次檢驗是否進入乙個矩形框 或者 是否直接利用這個矩形框的答案 僅僅利用兩個對角的座標進行更新即可。include include includeusing namespace std typedef long long l...