BZOJ 3262 陌上花開 CDQ

2021-08-07 21:44:07 字數 1422 閱讀 4769

time limit: 20 sec  memory limit: 256 mb

submit: 2457  solved: 1098

[submit][status][discuss]

有n朵花,每朵花有三個屬性:花形(s)、顏色(c)、氣味(m),又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量。定義一朵花a比另一朵花b要美麗,當且僅當sa>=sb,ca>=cb,ma>=mb。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。

第一行為n,k (1 <= n <= 100,000, 1 <= k <= 200,000 ), 分別表示花的數量和最大屬性值。

以下n行,每行三個整數si, ci, mi (1 <= si, ci, mi <= k),表示第i朵花的屬性

包含n行,分別表示評級為0...n-1的每級花的數量。

10 3

3 3 3

2 3 3

2 3 1

3 1 1

3 1 2

1 3 1

1 1 2

1 2 2

1 3 2

1 2 131

3010

1001

1 <= n <= 100,000, 1 <= k <= 200,000

樹套樹 cdq分治

cdq之初體驗

畢竟在這之前已經回了整體二分,理解上還是挺快的

推薦一篇【教程】簡易cdq分治教程&學習筆記

這題就是乙個裸的三位偏序問題

抄了份**感受一下

話說我這兩天怎麼墮落到不是抄就是粘 淚

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

typedef long long ll;

inline int read()

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

return x*f;

}void print(int x)

const int n=100100;

int n,m,a[n];

struct nodep[n];

inline bool cmp(int x,int y)

while(i>l)i--,modify(p[a[i]].c,-1);

i=l;j=mid+1;

while(j<=r||i<=mid)

{ if(i>mid)tmp[++top]=a[j++];

else if(j>r||p[a[i]].b

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遞迴時,可以採用先序遍...