陌上花開 CDQ分治

2022-04-29 03:15:07 字數 931 閱讀 8351

「cdq分治」從來都沒有聽說過,寫了這題才知道還有這麼神奇的演算法。

(被逼無奈)。w(゚д゚)w

於是看了不少dalao的部落格,對cdq演算法粗淺地了解了一點。(想要了解cdq的概念,可以看下這位dalao的部落格)

所以,這道題要怎麼做呢。。。

根據,cdq分治理論,這題按照題意建出來儲存資訊的陣列很明顯是個三維的。很巧的是,cdq分治的好處之一就是降維(根據官方民間說法,每降一維要付出乙個log的時間代價)。則本題的三維陣列,根據cdq就有:第一維用來直接排序,第二維做cdq分治,第三維做樹狀陣列。

為了能夠更加透徹地理解此題思路,借鑑了洛谷dalao的題解。

#include#include

using

namespace

std;

#define maxn 100005

struct nodea[maxn];

int n,m,tot,ans[maxn],sum[maxn<<2

];inline

bool cmp2(const node&a,const node&b)

inline

bool cmp1(const node&a,const node&b)

inline

void add(int x,int y)//

極簡的樹狀陣列

inline

int quary(int x)//

合併左右子區間的貢獻

inline

void cdq(int l,int

r)

for(int i=l,max=a[r].y;i<=mid&&a[i].y<=max;i++) add(a[i].z,-a[i].num);//

清空樹狀陣列(作案不留痕跡)

}int

main()

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

BZOJ 3262 陌上花開 CDQ分治

最近又研究了一下cdq分治,發現比樹套樹好寫多了啊。首先cdq分治只能優化掉一維,對於乙個三維問題,cdq分治先二分第一維,然後通過sort第二維後由左到右掃瞄確保第二維的順序,第三維則需要乙個計數的資料結構維護,一般是樹狀陣列或者線段樹,然後就完美地解決掉了問題。而對於cdq遞迴時,可以採用先序遍...