一道三維偏序的裸題,其實還是很好想的。(像我一樣的萌新先戳-->二維偏序
這次來的是三維了,那麼怎麼辦?二維偏序既可以用cdq分治,又可以用樹狀陣列,那三維偏序,不就一維排序,一維歸併,一維樹狀陣列不就行了?
那麼就用樹狀陣列替代之前的sum,因為之前sum就是直接累加了,那用樹狀陣列相當於再加了一層篩選。
ps:打cmp的時候,假如不喜歡用a[i].x
#include#include#include
#include
#include
#include
using
namespace
std;
struct
flower
a[110000];int
n,len;
void ins(int x,int y,int
z)bool
cmp(flower n1,flower n2)
void
sc()
//------------sc 第一維排序完成。--------------------
int m,s[210000
];int lowbit(int x)
void add(int x,intk)}
int getsum(int
x)
return
ans;}//
-----------樹狀陣列解決第三維--------------
flower t[
110000
];void cdq(int l,int r)//
歸併解決第二維,順便呼叫樹狀陣列
while(i<=mid)add(a[i].z,a[i].tot), t[p++]=a[i++];
while(j<=r)a[j].f+=getsum(a[j].z), t[p++]=a[j++];
for(int i=l;i<=mid;i++)add(a[i].z,-a[i].tot);//
清空樹狀陣列,這個如果打memset,每重for都乙個o(n)會掛
for(int i=l;i<=r;i++)a[i]=t[i];}//
-------cdq--------------
int ans[110000
];int
main()
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 樹狀陣列 秒掉,...