BZOJ 3262 陌上花開

2021-07-15 19:37:30 字數 2310 閱讀 7224

話說這是一道許可權題,如果我複製過來,bzoj不會打死我吧?hhh

大意就是給三維空間中的很多點,乙個點p(x,y,z)的級別定義為x0<=x && y0<=y && z0<=z的任意點p0(x0,y0,z0)的數量,求每種級別的點各有多少種。

看過一道二維的這樣的題目,當時想的是直接排序然後用bit(樹狀陣列)秒掉,題解給出了一種排序後用treap維護的方法(不涉及rotate),下面講一講這種方法(y為第一關鍵字,x為第二關鍵字排序)。

首先treap中的節點存兩個值,x座標和乙個sz(等於左兒子的size+1)。將排序後的點乙個乙個往座標系裡加,在treap中從根節點開始往下走,(設當前點為p)因為排過序所以保證只要當前在p左邊的點一定在p下方(這也就是用bit可以做的原因),設當前在treap裡走到的點為p1,答案為ans;

______________1,若p1.x>=p.x則說明p1的左邊多了乙個點,於是p1.sz++, 往左兒子走(其實我覺得是要往左兒子(以下簡稱lc)走才加的sz);

______________2,若p1.x<=p.x則說明p在p1右邊,所以p1的左子樹肯定都在p左邊,ans+=p1.sz;

一直往下走,走到p1==null就停止,把p放進去,此時p.sz=1;

我一開始也沒想明白;

1,p應該在很多點的左邊,為什麼處理了p1就往左走了?

2,如何做到不重不漏的?

想一想,把treap的根節點看做在座標系中一根x=k的線,如果你在k右邊,那麼k左邊的點數就等於k.sz,就統計完了;否則,往左走你又會碰到乙個點,設為k1,又跟k1比較,一樣的,這樣不斷移動,就能不重不漏統計完所有的點。

想到了什麼?這跟bit在本質上不是差不多嗎?如果每次恰好分成兩份,不就是乙個活生生的bit嗎?但是treap有優點,節點少(後面非常有用),但是treap有缺點,它會被卡成一條鏈(出題人比較良心沒卡我的裸treap)。

二維解決完畢

怎麼擴充套件到三維?排序,對;二維樹狀陣列是不是一眼做?可是開不下,難道要treap套treap?好像沒見過這玩意兒(廢話我才第一次寫樹套樹),那就bit套treap。先扔掉一維,像上面一樣,這一維沒用,那麼這就要求我們實現乙個功能,單點修改,矩陣求和。(沒有刪除好像很關鍵?好像沒刪除是為了讓整體二分過)於是外面bit維護x軸,內層treap維護某個矩陣,就像原來的bit的乙個節點維護某一段區間一樣。然後和二維差不多,外層bit的迴圈照樣寫,只是修改的那一句話要寫成treap的update。

這是樹套樹的第一篇所以寫的很長,以後應該就是一句話題解了。

//qwsin

#include

#include

#include

#include

using

namespace

std;

const

int maxn=100000+10;

const

int maxv=200000+10;

inline

int read()

struct hua

bool

operator

< (const hua &rhs)const

}a[maxn];

namespace treap

node(int lsz,int y):lsz(lsz),y(y)

};node* root[maxv];

inline

int query(int x,int y)

return count;

}inline

void updata(int x,int y)

if(fa==null) root[x]=new node(1,y);

else

if(t) fa->rc=new node(1,y);

else fa->lc=new node(1,y);

}}int maxx=0;

namespace bit

inline

void updata(int x,int y)

}int ans[maxn],kind[maxn];

int main()

for(int i=1,cnt;i<=n;i+=cnt)//先標記kind,方便後面將同位置的點合併,同類的點的等級都跟他們中的最後乙個一樣

for(int i=0;i<=n-1;i++) printf("%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。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。...

bzoj3262 陌上花開

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