bzoj3262 陌上花開

2022-05-06 11:33:07 字數 1716 閱讀 3268

1 #include 2 #include 3 #include 4 #include 5 #include 6

#define maxn 100005

7#define maxk 200005

8using

namespace

std;910

intn,k,m,sum[maxk],ans[maxn],sum_[maxn],ans_[maxn];

11struct

datefl[maxn];

14struct

noteqs[maxn];

1718

bool

comp1(date x,date y)

2324

bool

comp2(note x,note y)

2829

int lowbit(int

x)32

33void add(int x,int

y)36

37int query(int

x)42

return

temp;43}

4445

void cdq_solve(int l,int

r)55

for (int i=l;i<=temp;i++) add(qs[i].z,-qs[i].sum);56}

5758

intmain()else73}

74 cdq_solve(1

,m);

75for (int i=1;i<=m;i++) ans[ans_[i]+sum_[i]-1]+=sum_[i];

76for (int i=0;i"

%d\n

",ans[i]);

77return0;

78 }

view code

題目大意:有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的每級花的數量。

做法:三維,據說可以用樹套樹來寫(這個以後再嘗試寫一發),然後這題正解是傳統的cdq分治+排序+樹狀陣列,設花的三個屬性為x,y,z,我們將花按x為第一關鍵字,y為第二關鍵字,z為第三關鍵字排序,將屬性完全相同的縮成一朵花即可,同時維護sum陣列,即屬形為(x,y,z)的個數,所以在維護樹狀陣列的時候不能+1,而應該+sum[x]。排序後,後面的花只可能會被前面的花所影響,因為在該花後面的花x都比該花大,我們便能想到用cdq分治。

想到這點後,對於合併兩個區間資訊的問題,我們考慮兩個區間分別按y座標排序,依次第乙個區間中的花將z座標加入樹狀陣列,並及時維護第二個區間中的花的答案,這過程用兩個指標維護即可。

cdq分治+樹狀陣列

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