bzoj_3786_星系探索_splay維護出棧入棧序
物理學家小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可能會進行若干次實驗,對於他的每一次實驗,請你告訴他這一次實驗能量收集器的最終能量是多少。
第一行乙個整數n,表示星系的星球數。
接下來n-1行每行乙個整數,分別表示星球2-n的依賴星球編號。
接下來一行n個整數,表示每個星球在時刻0時的初始能量係數wi.
接下來一行乙個整數m,表示事件的總數。
事件分為以下三種型別。
(1)"q di"表示小c要開始一次實驗,收集器的初始位置在星球di.
(2)"c xi yi"表示星球xi的依賴星球變為了星球yi.
(3)"f pi qi"表示星球pi能量激發,常數為qi.
對於每乙個事件型別為q的事件,輸出一行乙個整數,表示此次實驗的收集器最終能量。31
14 5 7
5q 2
f 1 3
q 2c 2 3
q 29
1525
n<=100000,m<=300000,1=0
考慮用splay維護出棧入棧序,這樣我們求字首和就是點到根路徑的權值和了。
換根操作也比較容易實現,因為子樹對應著一段區間,直接移動子樹即可。
就是子樹加不太好做,因為是加點權,不包含係數。
於是我們再維護出有多少個正數有多少個負數即可。
**:
#include #include #include using namespace std;typedef long long ll;
#define n 200050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int head[n],to[n],nxt[n],cnt,ch[n][2],f[n],rt,n,m,tot,dfn[n],siz[n],son[n];
int zc[n],fc[n],a[n],type[n],val[n],w[n],fa[n];
ll sum[n];
int del[n];
char pbuf[100000],*pp=pbuf;
__attribute__((optimize("-o3")))void push(const char ch)
__attribute__((optimize("-o3")))void write(ll x) while(x);
while(top) push(sta[top--]+'0');
push('\n');
}__attribute__((optimize("-o3")))inline char nc()
__attribute__((optimize("-o3")))int rd()
__attribute__((optimize("-o3")))char rc()
__attribute__((optimize("-o3")))void give(int p,int v)
__attribute__((optimize("-o3")))void pushup(int p)
__attribute__((optimize("-o3")))void pushdown(int p)
}__attribute__((optimize("-o3")))void rotate(int x)
__attribute__((optimize("-o3")))void update(int p,int y)
__attribute__((optimize("-o3")))void splay(int x,int y)
__attribute__((optimize("-o3")))inline void add(int u,int v)
__attribute__((optimize("-o3")))void dfs(int x)
a[++tot]=x; type[tot+1]=-1; son[x]=tot+1; val[tot+1]=w[x];
}__attribute__((optimize("-o3")))void build(int fa,int l,int r)
__attribute__((optimize("-o3")))int pre()
__attribute__((optimize("-o3")))int suc()
__attribute__((optimize("-o3")))void huan(int x,int y)
__attribute__((optimize("-o3")))int find(int x)
}}__attribute__((optimize("-o3")))void print()
}__attribute__((optimize("-o3")))int main()
for(i=1;i<=n;i++) w[i]=rd();
dfs(1);
build(0,1,tot+2);
rt=(tot+3)>>1;
m=rd();
char opt;
while(m--) else if(opt=='c') else
}fwrite(pbuf,1,pp-pbuf,stdout);
}
BZOJ3786 星系探索
ett搞上,每條邊如果是一條從父到子的邊,那麼設其權值為兒子節點的權值,如果是一條從子到父的邊,那麼設其權值為兒子節點的權值的相反數,我們用乙個splay來維護整棵樹的尤拉序,那麼乙個節點到根的路徑的點權和就等於從根走尤拉序到這個點的邊權和 linkcut操作就相當於區間平移 子樹加就相當於把區間裡...
BZOJ3786 星系探索
一道ett板子題 筆者最開始用fhq treap打的ett,忘記可以沿fafa fa算出它的尤拉序,一直沒調出來,於是就改用splay了。ett的模板。其實我覺得叫它平衡樹板子就可以了 我們可以先通過尤拉序建出一顆平衡樹來,令inx in in x 為點x xx的入尤拉序,out xout outx...
bzoj3786 星系探索
題面 物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依賴星球b.此外,依賴關係具有傳遞性,即若星球a依賴...