「cdq分治」從來都沒有聽說過,寫了這題才知道還有這麼神奇的演算法。
(被逼無奈)。w(゚д゚)w
於是看了不少dalao的部落格,對cdq演算法粗淺地了解了一點。(想要了解cdq的概念,可以看下這位dalao的部落格)
所以,這道題要怎麼做呢。。。
根據,cdq分治理論,這題按照題意建出來儲存資訊的陣列很明顯是個三維的。很巧的是,cdq分治的好處之一就是降維(根據官方民間說法,每降一維要付出乙個log的時間代價)。則本題的三維陣列,根據cdq就有:第一維用來直接排序,第二維做cdq分治,第三維做樹狀陣列。
為了能夠更加透徹地理解此題思路,借鑑了洛谷dalao的題解。
#include#includeusing
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遞迴時,可以採用先序遍...