BZOJ3779 重組病毒

2021-09-26 00:02:50 字數 3000 閱讀 4481

窮哭了

難嗎?難碼.

首先觀察一下操作一,就是乙個access,但是要改變子樹啊,lct不緇瓷,所以線段樹稍微維護一下。

怎麼維護是乙個大難點啊。

是要分類討論的。

先找出實右子樹在原數上的根xxx。

情況rt=x

rt=x

rt=x

,直接修改整顆樹。

r trt

rt在子樹中,令y=r

ty=rt

y=rt

,跳到x

xx的兒子上,由於x

xx的整顆子樹,都不用經過x就可以到達y

yy,即可證明正確性,修改除此以外部分。

不在樹中,修改這棵子樹即可。

詢問也是類似的。

用d fs

dfsdf

s序是乙個好辦法。

#include

#include

#include

#include

#include

#define ll long long

#define gc getchar()

using

namespace std;

const

int n=

1e5+10;

inline

voidqr(

int&x)

while

(c>=

'0'&&c<=

'9')

x*=f;

}int rt,dep[n]

,fa[n][18

],tmp[n]

,st[n]

,ed[n]

,n,m,bin[18]

,tp;

inline

void

jump

(int

&a,int h)

struct sgttr[n<<2]

;inline

void

update

(int p)

inline

void

cad(

int p,

int ad)

void

pud(

int p)

void

build

(int p,

int l,

int r)

tr[p]

.l=l;tr[p]

.r=r;

int mid=

(l+r)

>>1;

build

(p<<

1,l,mid)

;build

(p<<1|

1,mid+

1,r)

;update

(p);

tr[p]

.c=tr[p<<1]

.c+tr[p<<1|

1].c;}

void

change

(int p,

int l,

int r,

int ad)

pud(p)

;int mid=

(tr[p]

.l+tr[p]

.r)>>1;

if(l<=mid)

change

(p<<

1,l,r,ad);if

(r>mid)

change

(p<<1|

1,l,r,ad)

;update

(p);

}void

change

(int x,

int ad)

else

change(1

,st[x]

,ed[x]

,ad);}

ll query

(int p,

int l,

int r)

double

query

(int x)

else

return

1.0*

query(1

,st[x]

,ed[x])/

(ed[x]

-st[x]+1

);}struct lctt[n]

;inline

bool

nroot

(int p)

void

crv(

int p)

void

pushdown

(int p)

void

rotate

(int p,

int w)

void

sdfs

(int p)

void

splay

(int p)}}

intfind

(int x)

void

access

(int x)

}void

makeroot

(int x)

struct edgea[n<<1]

;int len,last[n]

;void

ins(

int x,

int y)

;last[x]

=len;

}void

dfs(

int x)

ed[x]

=tp;

}char s[n][20

];int qx[n]

;int

main()

bool bk=0;

for(

int i=m;i>=

1;i--)if

(s[i][3

]=='q')if(

!bk)m=0;

for(

int i=

1;i<=m;i++

)return0;

}

BZOJ3779 重組病毒

題目大意 給一棵樹,每個點一開始顏色互不相同,支援三個操作 1.將乙個點到根的路徑染成一種新的顏色 2.將乙個新的點設為根,並將原來的根到這個點的路徑染成一種新的顏色 3.查詢乙個子樹 對於當前根 到根的路徑期望顏色數 真tm是道神題,idea實在是太妙了 首先由於第2個操作的特殊性,我們可以發現,...

bzoj 3779 重組病毒

一道好題 乙個點到根傳染需要的時間是這段路徑上不同顏色的數目,乙個點子樹到根平均傳染時間就是加權平均數了 好像是廢話 所以只要用線段樹維護dfs序就這個可以了,換根的話乙個點的子樹要麼在dfs序中不變,要麼被截成了 1,l 和 r,n 兩段 當這個點為當前root的祖先 l和r即為包含當前根的這個點...

bzoj 3779 重組病毒

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