BZOJ 3262 陌上花開 (裸CDQ分治)

2021-09-29 04:40:37 字數 1038 閱讀 6217

題目大意:

n個三元組,求每個能構成的偏序關係個數。偏序關係是三個元素都 不小於 另外乙個三元組的三個元素。

題目思路:

裸的cdq分治,首先排序降維,忽略x的影響,再對整個區間進行分治,有兩種分治策略。

1 . 先左區間, 右區間,考慮左區間對右區間的影響。

2.  先左區間 , 考慮左區間對右區間的影響 , 右區間。

對於本題來說,兩種都可以,先說第一種 , 這種的打法較為簡單,分治好左右區間後,將當前區間整體排序或者分左右兩部分排序(y做第一優先順序,z做第二優先順序),比較左邊和右邊的y值,並將左邊的y值小的,加入樹狀陣列,並且右區間算貢獻。

樹狀陣列使用後要記得清0 。

另外一種做法是先考慮影響,再右區間,在這個題目中,因為關於一對偏序關係,早晚回找到乙個區間累計貢獻第二種比較不同的地方是,要先把原來的陣列複製乙份,對複製體進行排序,不能對原來的陣列操作,否則影響了後邊的右區間遞迴。

**:(第一種做法)

#include#define ll long long

using namespace std;

const int maxn = 2e5+5;

struct node

c[maxn],b[maxn];

int c[maxn],ans[maxn];

int n,m,k;

void add(int x,int d)

}void clear(int x)

}bool cmp(node a,node b)

b[j].ans += ask(b[j].z);

}for(int i=l;i<=mid;i++)

}int main()

sort(c+1,c+1+n,cmp);

int num = 1;

for(int i=1;i<=n;i++)

sort(b+1,b+1+tot,cmp);

cdq(1,tot);

for(int i=1;i<=n;i++)

for(int i=0;i}

BZOJ3262 陌上花開

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

BZOJ3262 陌上花開

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

BZOJ 3262 陌上花開

話說這是一道許可權題,如果我複製過來,bzoj不會打死我吧?hhh 大意就是給三維空間中的很多點,乙個點p x,y,z 的級別定義為x0 x y0 y z0 z的任意點p0 x0,y0,z0 的數量,求每種級別的點各有多少種。看過一道二維的這樣的題目,當時想的是直接排序然後用bit 樹狀陣列 秒掉,...