BZOJ 3262 陌上花開 CDQ分治

2021-08-08 09:46:26 字數 535 閱讀 9530

最近又研究了一下cdq分治,發現比樹套樹好寫多了啊。。。

首先cdq分治只能優化掉一維,對於乙個三維問題,cdq分治先二分第一維,然後通過sort第二維後由左到右掃瞄確保第二維的順序,第三維則需要乙個計數的資料結構維護,一般是樹狀陣列或者線段樹,然後就完美地解決掉了問題。

而對於cdq遞迴時,可以採用先序遍歷,然後再對子區間排序合併成大區間;也可後序遍歷,在query完後拆成兩個對於二維已排序的子區間。

以下是**,注意注釋部分。

#include#include#include#include#includeusing namespace std;

const int maxn=100005;

struct node

bool operator < (const node a) const

for(int i=lt;i<=rt;i++)

q[i]=point[i];

int last=lt;

for(int i=mid+1;i<=rt;i++)

for(int i=lt;i

BZOJ 3262 陌上花開 CDQ

time limit 20 sec memory limit 256 mb submit 2457 solved 1098 submit status discuss 有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數...

BZOJ3262 陌上花開 CDQ分治

對第一關鍵字排序,分治每朵花,合併的時候通過歸併左右的花的第二關鍵字,將值插入樹狀陣列中求值。對於相同的花,先進行預處理即可。include bits stdc h define lowbit x x x using namespace std const int n 100005,m 200005...

bzoj 3262 陌上花開(cdq分治)

time limit 20 sec memory limit 256 mb submit 1431 solved 644 submit status discuss 有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量...