BZOJ3786 星系探索

2021-10-13 17:54:38 字數 2390 閱讀 5332

一道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依賴...