BZOJ3262 陌上花開

2021-07-09 21:11:50 字數 1827 閱讀 4075

description

有n朵花,每朵花有三個屬性:花形(s)、顏色(c)、氣味(m),又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量。定義一朵花a比另一朵花b要美麗,當且僅當sa>=sb,ca>=cb,ma>=mb。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。

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

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

sample output

3 1

3 0

1 0

1 0

0 1

hint

1 <= n <= 100,000, 1 <= k <= 200,000

solution

我們把第一維的要求視作時間,進行排序,再運用cdq分治的思想,然後我們就可以將問題轉化為:

給出乙個點集,查詢乙個點左下方點的數量

解決這個問題我們只需要,我們將一維排序,一維樹狀陣列統計即可

這樣排序會多乙個lo

g 出來,我們可以時刻維護乙個有序表,採用線性合併有序表的方式把這個lo

g 卡掉

code

#include 

using

namespace

std;

typedef pair pii;

const

int n = 200010;

struct packlst[n],tmp[n];

int n,m,k,d[n],top;

pii st[n];

int cnt[n];

inline

bool cmp(const pack &a,const pack &b)

inline

int qry(int x)

inline

void rollback()

inline

void solve(int l,int r)

int mid=l+r>>1,pl,pr,cp;

solve(l,mid);solve(mid+1,r);

for(pl=l,pr=mid+1,cp=l;pl<=mid || pr<=r;)

if(pl<=mid && (pr>r || lst[pl].b<=lst[pr].b)) mdf(lst[pl].c,lst[pl].cnt),tmp[cp++]=lst[pl++];

else lst[pr].ans+=qry(lst[pr].c),tmp[cp++]=lst[pr++];

for(int i=l;i<=r;i++) lst[i]=tmp[i];

rollback();

}int main()

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

bzoj3262 陌上花開

有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量。定義一朵花a比另一朵花b要美麗,當且僅當sa sb,ca cb,ma mb。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。第一行為n,k 1 n ...