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