bzoj3262 陌上花開

2021-08-16 08:57:00 字數 2763 閱讀 1108

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

splay+樹狀陣列 針對第一維 排序 針對第二維 做乙個樹狀陣列 針對第三維在每個splay上維護一些東西 每次log^2查詢即可 注意重複的 要把他們打包處理

#include

#include

#define n 110000

#define m 220000

using namespace std;

inline char gc()

return

*s++;

}inline int

read()

while(ch<='9'&&ch>='0') x=x

*10+ch-'0',ch=gc();

return

x*f;

}struct nodeqr[n];

int size[20

*n],cnt[20

*n],v[20

*n],fa[20

*n],c[20

*n][2],rt[n<<1],ans[n],mx,n,num;

inline bool cmp(const node &a,const node &b)

inline void rotate(int

x,int &tar)

inline void splay(int

x,int &tar)rotate(x,tar);

}}inline void insert1(int &x,int vv,int f,int id)

if (v[x]==vv)

if (vvx]) insert1(c[x][0],vv,x,id);else insert1(c[x][1],vv,x,id);

}inline void add(int b,int c)

inline int qr1(int

x,int vv)

inline int query(int b,int c)

inline void print(int

x)int main()

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

return

0;}

cdq分治 注意打包處理 以及排序細節

#include

#include

#define n 110000

#define m 220000

using namespace std;

inline char gc()

return

*s++;

}inline int

read()

while(ch<='9'&&ch>='0') x=x

*10+ch-'0',ch=gc();

return

x*f;

}struct nodeqr[n],tmp[n],qr1[n];

ints[m],ans[n],mx,n;

inline bool cmp(const node &a,const node &b)

inline int query(int

x)inline void clear(int

x)inline void cdq(int l,int r)while(l1<=mid) tmp[now++]=qr[l1++];

while(l2<=r) qr[l2].ans+=query(qr[l2].c),tmp[now++]=qr[l2++];

for (int i=l;i<=mid;++i) clear(qr[i].c);

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

}int main()cdq(1,tot);

//for (int i=1;i<=tot;++i) printf("%d

%d%d

%d\n",qr[i].a,qr[i].b,qr[i].c,qr[i].ans);

for (int i=1;i<=tot;++i) ans[qr[i].ans+qr[i].nm-1]+=qr[i].nm;

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