bzoj 3779 重組病毒

2022-04-30 08:51:06 字數 3027 閱讀 8883

一道好題~~

乙個點到根傳染需要的時間是這段路徑上不同顏色的數目,乙個點子樹到根平均傳染時間就是加權平均數了(好像是廢話)。

所以只要用線段樹維護dfs序就這個可以了,換根的話乙個點的子樹要麼在dfs序中不變,要麼被截成了[1,l)和(r,n]兩段(當這個點為當前root的祖先),l和r即為包含當前根的這個點的那個兒子的dfs序中的st和ed,只要分類討論一下就可以了。

1 #include2 #include3 #include4 #include5

#define n 100005

6#define ll long long

7using

namespace

std;

8int head[n],nxt[n*2],ver[n*2],tot;int

n,m;

9void addd(int a,int

b)10

13int rev[n],ch[n][2

],root,l[n],r[n],fa[n],faa[n];

14bool isroot(int

x)15

18void push_down(int

x)19

27return;28

}29void push_up(int

x)30

36void rotate(int

p)37

47 fa[q]=p;

48push_up(q);49}

50int

q[n],topp;

51void splay(int

x)5264}

65push_up(x);66}

67struct

node

68a[n*10

];71

intsz[n];

72int

st[n],ed[n],z,jian[n],dep[n],top[n],son[n];

73int find(int x,int

y)74

80return

son[x];81}

82void dfs(int x,int

f)83

94 ed[x]=z;

95return;96

}97void dffs(int x,int f,int

tp)98

106}

107void pd(int x,int l,int mid,int

r)108

return

;116

}117 ll qur(int x,int l,int r,int lll,int

rr)118

124int mid=(l+r)>>1

;125

pd(x,l,mid,r);

126if(lll>mid)return qur(x*2+1,mid+1

,r,lll,rr);

127if(rr<=mid)return qur(x*2

,l,mid,lll,rr);

128return qur(x*2,l,mid,lll,rr)+qur(x*2+1,mid+1

,r,lll,rr);

129}

130void add(int x,int l,int r,int lll,int

rr,ll z)

131139

int mid=(l+r)>>1

;140

pd(x,l,mid,r);

141if(lll<=mid)add(x*2

,l,mid,lll,rr,z);

142if(rr>mid)add(x*2+1,mid+1

,r,lll,rr,z);

143 a[x].sum=a[x*2].sum+a[x*2+1

].sum;

144}

145void build(int x,int l,int

r)146

152int mid=(l+r)>>1

;153 build(x*2,l,mid);build(x*2+1,mid+1

,r);

154 a[x].sum=a[x*2].sum+a[x*2+1

].sum;

155return

;156

}157

void gao(int x,int

z)158

163else

if(st[x]=ed[root])

164169

else

170173

}174

void access(int

x)175

184 ch[x][1]=t;

185push_up(x);

186}

187return

;188

}189

void make_root(int

x)190

195int qursize(int

x)196

203else

return

sz[x];

204}

205 ll qurs(int

x)206

213return qur(1,1

,n,st[x],ed[x]);

214}

215int

main()

216224 dep[1]=1

;225 dfs(1,-1

);226 build(1,1

,n);

227 dffs(1,-1,1

);228

char c[10];root=1;int

tmp;

229for(int i=1;i<=m;i++)

230239

else

if(c[3]=='l'

)240

244else

245249

}250

return0;

251 }

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 重組病毒

黑客們通過對已有的病毒反編譯,將許多不同的病毒重組,並重新編譯出了新型的重組病毒。這種病毒的繁殖和變異能力極強。為了阻止這種病毒傳播,某安全機構策劃了一次實驗,來研究這種病毒。實驗在乙個封閉的區域網內進行。區域網內有n臺計算機,編號為1 n。一些計算機之間通過網線直接相連,形成樹形的結構。區域網中有...