ett搞上,每條邊如果是一條從父到子的邊,那麼設其權值為兒子節點的權值,如果是一條從子到父的邊,那麼設其權值為兒子節點的權值的相反數,我們用乙個splay來維護整棵樹的尤拉序,那麼乙個節點到根的路徑的點權和就等於從根走尤拉序到這個點的邊權和
linkcut操作就相當於區間平移
子樹加就相當於把區間裡父到子的邊加,子到父的邊減
維護區間和
就過了注意w[i]開始可以得0
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define maxn 200010
#define maxm 1010
#define inf 1000000000
#define mod 1000000007
#define eps 1e-8
#define ll long long
#define tr son[son[rt][1]][0]
struct vec;
vec mp[maxn];
int tai[maxn],cnt;
int w[maxn];
int s[maxn],t[maxn];
int a[maxn],tim;
int rt;
int st[maxn],tp;
int fa[maxn],son[maxn][2];
ll v[maxn],ch[maxn],sum[maxn],siz[maxn];
int typ[maxn];
int n,m;
inline void be(int x,int y)
inline void ud(int x)
inline void toch(int x,ll y)
sum[x]+=siz[x]*y;
if(typ[x]==1)
if(typ[x]==-1)
ch[x]+=y;
}inline void pd(int x)
}inline void cot(int x,int y,bool z)
if(y)
}inline void rot(int x,bool z)
void dfs(int x)
a[t[x]=++tim]=-w[x];
typ[tim]=-1;
}void build(int &x,int l,int r,int f)
int mid=l+r>>1;
x=mid;
fa[x]=f;
v[x]=a[x];
build(son[x][0],l,mid-1,x);
build(son[x][1],mid+1,r,x);
ud(x);
}inline void apd(int x)
for(;tp;tp--)
}void splay(int x,int y)elseelse
} xx=fa[x],***=fa[xx];
} ud(x);
if(!y)
}int findp(int x)
return x;
}int findn(int x)
return x;
}int main()
for(i=1;i<=n;i++)
a[++tim]=0;
dfs(1);
a[++tim]=0;
build(rt,1,tim,0);
scanf("%d",&m);
while(m--)
if(o[0]=='f')
if(o[0]=='c')
} return 0;}/*
3114 5 7
5q 2
f 1 3
q 2c 2 3
q 2*/
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依...
bzoj3786 星系探索
題面 物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依賴星球b.此外,依賴關係具有傳遞性,即若星球a依賴...