最近又研究了一下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 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量...