bzoj3262 陌上花開

2021-07-31 15:52:15 字數 1687 閱讀 5652

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

hint

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

題解 樹套樹,不會cdq,注意去重。

**

#include

#include

#include

#include

#define n 15000005

int sum[n],add[n],ls[n],rs[n],sz,root[200005];

struct nodea[200005];

int ans[200005],num[200005];

bool cmp(node a,node b)

int lowbit(int x)

void change(int &k,int l,int r,int x,int y)

int mid=(l+r)>>1;

if (y<=mid) change(ls[k],l,mid,x,y);

else

if (x>mid) change(rs[k],mid+1,r,x,y);

else

sum[k]=sum[ls[k]]+sum[rs[k]]+add[k]*(r-l+1);

} int query(int &k,int l,int r,int x,int y)

int main()

sort(a+1,a+n+1,cmp);

int p=1;

for (int i=1;i<=n;i++)

else

if (i!=1) ans[num[i-1]]+=p,p=1;

int sum=0;

for (int x=a[i].c;x;x-=lowbit(x))

sum+=query(root[x],1,k,1,a[i].m);

for (int x=a[i].c;x<=k;x+=lowbit(x))

change(root[x],1,k,a[i].m,a[i].m);

num[i]=sum;

}ans[num[n]]+=p;

for (int i=0;iprintf("%d\n",ans[i]);

return

0; }

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