一道ett板子題
筆者最開始用fhq_treap打的ett,忘記可以沿fafa
fa算出它的尤拉序,一直沒調出來,於是就改用splay了。
ett的模板。其實我覺得叫它平衡樹板子就可以了
我們可以先通過尤拉序建出一顆平衡樹來,令inx
in_in
x為點x
xx的入尤拉序,out
xout_
outx
為點x
xx的出尤拉序。
容易發現,inr
oo
tin_
inroot
到in
vin_
inv
的區間中刪去既有出又有入的點,得到的就是從根到點v
vv的入點的路徑。
於是,第乙個操作求這條路徑的和我們可以轉化為求這個區間之和。將點out
xout_
outx
的權值賦值為點inx
in_in
x的相反數,這樣統計得到的區間的和可以將沒有經過的點消去,得到答案。
我們又知道,從inx
in_in
x到o ut
xout_
outx
的區間是點x
xx的子樹,所以只需要將這個區間拆下來,接到其後面就可以完成操作二了。
操作三也就是平衡樹的常規操作,打個懶標記就能解決。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define maxn 200005
typedef
long
long ll;
const ll inf=
0x7f7f7f7f
;typedef
unsigned
long
long ull;
typedef pair<
int,
int> pii;
template
<
typename _t>
void
read
(_t &x)
while
('0'
<=s&&s<=
'9')
x*=f;
}struct edgee[maxn]
;int head[maxn]
,tot,a[maxn]
,n,m;
void
addedge
(int u,
int v)
;head[u]
=tot;
}class
splay
void
work
(int rt,
int w)
void
pushdown
(int rt)
void
rotate
(int x,
int&k)
fa[x]
=z;fa[y]
=x;fa[ch[x]
[r]]
=y;ch[y]
[l]=ch[x]
[r];ch[x]
[r]=y;
pushup
(y);
pushup
(x);
}void
splay
(int x,
int&k)
rotate
(x,k);}
}int
findl
(int x)
intfindr
(int x)
public
:void
insert
(int x,
int v,
int w)
ll query
(int x)
void
link
(int x,
int y)
void
modify
(int x,
int w)
void
build
(int u)
}t;signed
main()
;while
(m--
)return0;
}
BZOJ3786 星系探索
ett搞上,每條邊如果是一條從父到子的邊,那麼設其權值為兒子節點的權值,如果是一條從子到父的邊,那麼設其權值為兒子節點的權值的相反數,我們用乙個splay來維護整棵樹的尤拉序,那麼乙個節點到根的路徑的點權和就等於從根走尤拉序到這個點的邊權和 linkcut操作就相當於區間平移 子樹加就相當於把區間裡...
BZOJ 3786 星系探索
bzoj 3786 星系探索 splay維護出棧入棧序 物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依...
bzoj3786 星系探索
題面 物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依賴星球b.此外,依賴關係具有傳遞性,即若星球a依賴...