一道好題~~
乙個點到根傳染需要的時間是這段路徑上不同顏色的數目,乙個點子樹到根平均傳染時間就是加權平均數了(好像是廢話)。
所以只要用線段樹維護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。一些計算機之間通過網線直接相連,形成樹形的結構。區域網中有...