BZOJ 3262 陌上花開

2021-09-27 02:42:28 字數 2249 閱讀 9691

descriptiona

>=s

bs_a>=s_b

sa​>=s

b​,c

a>=c

bc_a>=c_b

ca​>=c

b​,m

a>=m

bm_a>=m_b

ma​>=m

b​。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。

input

第一行為n,k (1 <= n <= 100,000, 1 <= k <= 200,000 ), 分別表示花的數量和最大屬性值。以下n行,每行三個整數si, ci, mi (1 <= si, ci, mi <= k),表示第i朵花的屬性。

output

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

sample input

1033

3323

3231

3113

1213

1112

1221

3212

1

sample output

313

0101

001

思路

首先按照題目定義,兩朵屬性完全相同的花都比對方要美麗,所以讀入所有花的資料之後有必要排序去重,記錄一下每種(三元組)屬性的花的數量。

然後沒什麼想法。。。。。

開始面向題解程式設計

看了下網上的題解,說是cdq分治套樹狀陣列。

考慮將待處理的序列先按s排序,再將序列一分兩半,我們分別計算完了這兩半的答案,那麼剩下的需要計算的答案就是左邊對右邊的貢獻(考慮先前是按s排序故一定滿足左邊的s小於或等於右邊的s)

這時我們分別對左邊一半和右邊一半按c排序,再分別建立兩個指標用於遍歷左邊一半和右邊一半。

現在左邊一半和右邊一半都滿足按c公升序排列並且左邊的s均小於等於右邊的s。

我們考慮建立乙個樹狀陣列用來計數。sum(n)用於樹狀陣列求和。

ac**

#include

#include

using namespace std;

typedef

struct datadata;

intcmp

(data a,data b)

data d[

100005];

int su[

200005

],ans[

200005

],n,k;

int n=0;

intlowbit

(int x)

void

inse

(int now,

int v)

return;}

intsum

(int x)

return ans;

}int

cmp2

(data a,data b)

void

cdq(

int l,

int r)

d[h2]

.ans+

=sum

(d[h2]

.m);

}while

(h2;for

(int i=l;i)inse

(d[i]

.m,-

(d[i]

.num+1)

);return;}

intmain()

sort

(d+1

,d+n+

1,cmp)

;for

(int i=

1;i<=n;i++

)else

}//去重,並計數

cdq(

1,n)

;for

(int i=

1;i<=n;i++

) ans[d[i]

.num+d[i]

.ans]

+=d[i]

.num+1;

for(

int i=

0;i)printf

("%d\n"

,ans[i]);

return0;

}

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