description
物理學家小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序是有一點類似的,就是在乙個點進入dfs的時候(入棧)在當前位置加入乙個正的權值,在結束dfs(出棧)時在當前位置加入乙個負的權值,那麼求乙個點x到根的權值和,就可以求1到x入棧位置的權值和,因為此時只有x到根路徑上的點在棧中。對於換父親操作,只需要splay區間移動操作就可以了。注意把一段區間提取出來時不能簡單的把l-1和r+1之間的提取,而需要找到排名在其前或後一位的位置。
#include
#include
#include
#include
using
namespace
std;
const
int maxn=200010;
#define ll long long
struct node
tr[maxn<<1];//sv子樹和 v節點權值 type節點型別 st子樹節點型別和
int n;ll w[maxn];
int tot=0,root;
void work(int x,ll v)
void up(int x)
void down(int x)
}void rotate(int x)
int sta[maxn],top;
void update(int x)
void splay(int x,int rt)
if(!rt)root=x;
}int find1(int rank)
}int find2(int x)
struct edgee[maxn];
int len=0,last[maxn];
void ins(int x,int y)
int dfn=1,l[maxn],r[maxn];
void dfs(int x)
void build(int l,int r,int fa)
void workq()
void workf()
void workc()
int main()
for(int i=1;i<=n;i++)scanf("%lld",&w[i]);
dfs(1);
tr[1].d=tr[1].sv=tr[1].st=0;
tr[dfn+1].d=dfn+1;tr[dfn+1].sv=tr[dfn+1].st=0;
root=(dfn+1)>>1;
build(1,dfn+1,0);
int q;
scanf("%d",&q);
while(q--)
}
bzoj 3786 星系探索 splay
bzoj真是坑爹,本地跑的差不多的程式,指標比陣列快到不知道 去了。然後我就開始了艱辛的卡常數,最終比很多指標快多辣 由於有子樹移動,那麼考慮維護括號序列。也就是dfs入棧為 出棧為 然後 為正的權值。那麼子樹移動相當於平衡樹的 和合併。用splay實現。ps 求卡常數大神優化 ac 如下 目前最快...
BZOJ3786 星系探索
ett搞上,每條邊如果是一條從父到子的邊,那麼設其權值為兒子節點的權值,如果是一條從子到父的邊,那麼設其權值為兒子節點的權值的相反數,我們用乙個splay來維護整棵樹的尤拉序,那麼乙個節點到根的路徑的點權和就等於從根走尤拉序到這個點的邊權和 linkcut操作就相當於區間平移 子樹加就相當於把區間裡...
BZOJ3786 星系探索
一道ett板子題 筆者最開始用fhq treap打的ett,忘記可以沿fafa fa算出它的尤拉序,一直沒調出來,於是就改用splay了。ett的模板。其實我覺得叫它平衡樹板子就可以了 我們可以先通過尤拉序建出一顆平衡樹來,令inx in in x 為點x xx的入尤拉序,out xout outx...