BZOJ3262 陌上花開

2022-04-14 03:49:58 字數 1881 閱讀 6167

題目描述

有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 1

樣例輸出

313

0101001

膜拜cdq小姐姐

cdq分治一般情況下會用來解決三維偏序問題,一般的套路是第一維直接快排,然後進行cdq分治,在分治過程中通過歸併再次使得第二維有序,當然,不歸併可以再次對部分資料快排,打起來肯定快排爽,不過過程中要處理的東西處理起來應該也有點難受,如果**能力是大佬,就當剛才什麼都沒說,由於進行操作前已經保證了第一維有序,左區間均可對右區間作出貢獻,所以在歸併第二維時第一維已經不重要了,第三維的有序一般通過樹狀陣列等資料結構實現,需要注意的是對於維護第三維的資料結構需要每次清空,但是千萬不要memset之類的全部清空,別覺得memset一句話就快,他就是o(n),只需要清空當前區間,不然很可能t到飛起,上述就是cdq分治的基本思路

陌上花開是cdq最經典的三維偏序問題,思路就是上述那個,這題需要注意的是由於等於的存在,要在排序之後去重,其他的,樹狀陣列記得打對,存的是第三維,記得不管是陣列範圍還是操作結尾,均是k而不是n,來自wa了6遍的調了一天半的過來人的提醒,圖就不貼了,丟人

1 #include2 #include3 #include4

#define maxn 100100

5using

namespace

std;

6struct

nodea[maxn],gb[maxn];

9int

n,k,tot;

10int c[maxn*2

],ans[maxn];

11bool cmp(const node &a,const node &b)

1217

int lowbit(int

x)18

21void add(int x,int

w)22

25int getsum(int

w)26

31void cdq(int l,int

r)32

39else 40}

41while(ll<=mid)

42while(rr<=r)

43for(int i=l;i<=r;++i)

4448}49

intmain()

5058

}59 cdq(1

,tot);

60for(int i=1;i<=tot;++i) ans[a[i].sum+a[i].js-1]+=a[i].js;

61for(int i=0;i"

%d\n

",ans[i]);

62return0;

63 }

一定寫對樹狀陣列

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 樹狀陣列 秒掉,...