傳送門:
思路:release操作怎麼給人一種access的感覺呢?
「如果新變種在感染過程中尚未銷毀過這類舊變種,需要先花費1單位時間分析舊變種,才能銷毀」
這不就是到根統計虛邊條數+1嗎
繼續看下去
recenter好像就是換根,換完了正好要access一下
request詢問子樹每個點到根的路徑虛邊數+1的平均值
子樹操作lct不滋磁
拿個線段樹維護一下dfs序就好了
換根之後線段樹也是可以做的,要分情況討論
可以參見bzoj
3083: 遙遠的國度
設當前根為root,要加/減虛邊條數的子樹根是x,w[x]是x的dfs序,last[x]表示
最初的樹中
x的子樹中的 最大dfs序
1.x==root,直接對整棵樹修改
2.最初的樹中,root在x的子樹裡,設既是x的兒子,又是root的祖先的點是y
那麼修改區間[1,w[y]-1],[last[y]+1,n](除去子樹y的所有點)即可
3.最初的樹中,root不在x的子樹裡
修改x的子樹即可
#include#include#include#includeconst int maxn=100010,maxm=200010,maxt=maxn<<2;
typedef long long ll;
using namespace std;
int n,q,pre[maxm],now[maxn],son[maxm],tot,tim,last[maxn],w[maxn],tmp[maxn],dep[maxn],root=1,fa[maxn][22],pw[22];char op[12];
void add(int a,int b)
void jump(int &a,int h)
struct tsegment_tree
inline void inc(int p,int v)
inline void down(int p)
void build(int p,int l,int r)
build(ls,l,mid),build(rs,mid+1,r);
update(p),siz[p]=siz[ls]+siz[rs];
} void modify(int p,int l,int r,int a,int b,int v)
down(p);
if (b<=mid) modify(ls,l,mid,a,b,v);
else if (a>mid) modify(rs,mid+1,r,a,b,v);
else modify(ls,l,mid,a,mid,v),modify(rs,mid+1,r,mid+1,b,v);
update(p);
} ll query(int p,int l,int r,int a,int b)
void modify(int x,int v)
else modify(1,1,n,w[x],last[x],v);
} double query(int x)
else return 1.0*query(1,1,n,w[x],last[x])/(last[x]-w[x]+1);
}}t;
struct tlct
inline int which(int x)
inline void update(int x)
inline void rever(int x)
inline void down(int x)
void relax(int x)
void rotate(int x)
void splay(int x)
update(x);
} int shallow(int x)
void access(int x)
} void makeroot(int x)
}lct;
void dfs(int x)
int main(){
pw[0]=1;for (int i=1;i<=20;i++) pw[i]=pw[i-1]<<1;
scanf("%d%d",&n,&q);
for (int i=1,x,y;i
BZOJ3779 重組病毒
題目大意 給一棵樹,每個點一開始顏色互不相同,支援三個操作 1.將乙個點到根的路徑染成一種新的顏色 2.將乙個新的點設為根,並將原來的根到這個點的路徑染成一種新的顏色 3.查詢乙個子樹 對於當前根 到根的路徑期望顏色數 真tm是道神題,idea實在是太妙了 首先由於第2個操作的特殊性,我們可以發現,...
BZOJ3779 重組病毒
窮哭了 難嗎?難碼.首先觀察一下操作一,就是乙個access,但是要改變子樹啊,lct不緇瓷,所以線段樹稍微維護一下。怎麼維護是乙個大難點啊。是要分類討論的。先找出實右子樹在原數上的根xxx。情況rt x rt x rt x 直接修改整顆樹。r trt rt在子樹中,令y r ty rt y rt ...
bzoj 3779 重組病毒
一道好題 乙個點到根傳染需要的時間是這段路徑上不同顏色的數目,乙個點子樹到根平均傳染時間就是加權平均數了 好像是廢話 所以只要用線段樹維護dfs序就這個可以了,換根的話乙個點的子樹要麼在dfs序中不變,要麼被截成了 1,l 和 r,n 兩段 當這個點為當前root的祖先 l和r即為包含當前根的這個點...