bzoj3262陌上花開 cdq分治

2022-05-07 10:00:10 字數 1607 閱讀 3587

time limit: 20 sec  memory limit: 256 mb

submit: 2794  solved: 1250

[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分治

首先把所有元素按照x排序,然後進行cdq分治

在分治時,總是由分治左區間向右區間轉移答案,可以保證轉移的x滿足條件

按照y排序再轉移,保證y有序

樹狀陣列維護z,保證z有序

由於分治是層層遞迴下去的,所以每個點一定都會計算完它的字首貢獻的答案

另外,cdq分治的核心思想是:先處理左區間,再處理左區間對右區間貢獻的答案,最後處理右區間

但對於這個題,可以先左再右,最後左向右貢獻答案

1 #include2

#define n 100005

3using

namespace

std;

4int n,m,pa,pb,acnt,bcnt,tot,cnt[n],pos[n],c[n<<1];5

struct infoq[n],a[n],b[n];

6bool

cmp1(info a,info b)

11return a.x13bool cmp2(info a,info b)

14void add(int p,int

v)19}20

int query(int

p)26

return

ret;27}

28void cdq(int l,int

r)44 q[b[pb].id].ans+=query(b[pb].z);

45 ++pb;46}

47for(int i=1;i<=tot;++i)add(pos[i],-1

);48 cdq(mid+1

,r);49}

50int

main()

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