bzoj3786 星系探索

2022-05-09 13:00:47 字數 1861 閱讀 2430

題面:

物理學家小c的研究正遇到某個瓶頸。

他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球(方便起見我們預設其為1號星球),其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。

我們定義依賴關係如下:若星球a的依賴星球是b,則有星球a依賴星球b.此外,依賴關係具有傳遞性,即若星球a依賴星球b,星球b依賴星球c,則有星球a依賴星球c.

對於這個神秘的星系中,小c初步**了它的性質,發現星球之間的依賴關係是無環的。並且從星球a出發只能直接到達它的依賴星球b.

每個星球i都有乙個能量係數wi.小c想進行若干次實驗,第i次實驗,他將從飛船上向星球di發射乙個初始能量為0的能量收集器,能量收集器會從星球di開始前往主星球,並收集沿途每個星球的部分能量,收集能量的多少等於這個星球的能量係數。

但是星系的構成並不是一成不變的,某些時刻,星系可能由於某些複雜的原因發生變化。

有些時刻,某個星球能量激發,將使得所有依賴於它的星球以及他自己的能量係數均增加乙個定值。還有可能在某些時刻,某個星球的依賴星球會發生變化,但變化後依然滿足依賴關係是無環的。

現在小c已經測定了時刻0時每個星球的能量係數,以及每個星球(除了主星球之外)的依賴星球。接下來的m個時刻,每個時刻都會發生一些事件。其中小c可能會進行若干次實驗,對於他的每一次實驗,請你告訴他這一次實驗能量收集器的最終能量是多少。

學長出的題啊。。。

尤拉序+splay,將每個點按dfs序分成兩個點,然後進行:

1.區間求和(splay基礎)

2.區間加法(還是splay基礎)

3.區間移動(其實就是刪除+插入)

需要注意的是區間加法。為了維護字首和的正確性,標記下推時應程乙個係數(1 、-1)。

**:

#include#include

using

namespace

std;

#define n 100050

#define ll long longll n,m,hed[n],cnt;

struct

edge

e[n];

void

ae(ll f,ll t)

struct

splay

tr[2*n];

ll tin[n],tout[n],tot=1

,a[n],rt;

void

dfs(ll u)

void

update(ll u)

void

pushdown(ll x)

}void

build(ll l,ll r,ll f)

void

rotate(ll x)

void

splay(ll x,ll goal)

if(!goal)rt =x;

}ll get_th(ll x)

ll find_kth(ll x,ll k)

void

ccc(ll x,ll y)

void

fff(ll x,ll d)

intmain()

for(ll i=1;i<=n;i++)scanf("

%lld

",&a[i]);

dfs(1);

build(

1,2*n+2,0

); rt = (2*n+3)>>1

; scanf(

"%lld

",&m);

char ch[2

]; ll x,y;

for(ll i=1;i<=m;i++)

else

if(ch[0]=='c'

)

else

}return0;

}

BZOJ3786 星系探索

ett搞上,每條邊如果是一條從父到子的邊,那麼設其權值為兒子節點的權值,如果是一條從子到父的邊,那麼設其權值為兒子節點的權值的相反數,我們用乙個splay來維護整棵樹的尤拉序,那麼乙個節點到根的路徑的點權和就等於從根走尤拉序到這個點的邊權和 linkcut操作就相當於區間平移 子樹加就相當於把區間裡...

BZOJ3786 星系探索

一道ett板子題 筆者最開始用fhq treap打的ett,忘記可以沿fafa fa算出它的尤拉序,一直沒調出來,於是就改用splay了。ett的模板。其實我覺得叫它平衡樹板子就可以了 我們可以先通過尤拉序建出一顆平衡樹來,令inx in in x 為點x xx的入尤拉序,out xout outx...

BZOJ 3786 星系探索

bzoj 3786 星系探索 splay維護出棧入棧序 物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依...