話說這是一道許可權題,如果我複製過來,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 ...