bzoj3779 重組病毒

2022-08-22 21:24:13 字數 2095 閱讀 7776

傳送門:

思路: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即為包含當前根的這個點...