Foreign 染色 LCT 線段樹

2022-05-20 07:33:23 字數 3132 閱讀 1862

詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。

我們將邊兩端的點顏色相同的邊設為實邊不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。

那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在lct進行access的時候進行+-1修改,然後詢問的時候用區間求和求得答案即可。

1 #include2 #include

3 #include4 #include5 #include6 #include7 #include8 #include9

using

namespace

std;

10 typedef long

long

s64;

11const

int one=1500001;12

13int

n,m,x,y;

14int

pos[one],size[one],dep[one],dfn[one],cnt;

15s64 res;

16char ch[5

];17

18int

lc[one],rc[one],fa[one];

1920

intget

()21

3031

namespace

tree

3240

41void dfs(int u,int

father)

4254}55

}5657namespace

seg58

node[one];

6364

void pushdown(int i,int

q)6574}

7576

void build(int i,int l,int

r)77

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

;84 build(i<<1,l,mid); build(i<<1|1,mid+1

,r);

85 node[i].value=node[i<<1].value+node[i<<1|1

].value;86}

8788

void update(int i,int l,int r,int l,int r,int

x)89

9697 pushdown(i,r-l+1

);98

int mid=(l+r)>>1;99

if(l<=mid) update(i<<1

,l,mid,l,r,x);

100if(mid+1

<=r) update(i<<1|1,mid+1

,r,l,r,x);

101 node[i].value=node[i<<1].value+node[i<<1|1

].value;

102}

103104

void query(int i,int l,int r,int l,int

r)105

111 pushdown(i,r-l+1

);112

int mid=(l+r)>>1

;113

if(l<=mid) query(i<<1

,l,mid,l,r);

114if(mid+1

<=r) query(i<<1|1,mid+1

,r,l,r);

115}

116}

117118

namespace

lct119

124125

void turn(int

x)126

139140

if(x==lc[y]) rc[x]=y,lc[y]=b;

141else lc[x]=y,rc[y]=b;

142}

143144

void splay(int

x)145

153turn(x);

154}

155}

156157

int find_root(int

x)158

162163

void access(int

x)164

173 rc[p]=q;

174if

(rc[p])

175179

}180

}181

}182

183int

main()

184192 tree::dfs(1,0

);193 seg::build(1,1

,n);

194195 m=get

();196

while(m--)

197203

else

204209

}210

211 }

view code

SDOI2017 樹點染色 線段樹 LCT

本來只是想練練lct,沒想到是個線段樹 對於操作1 誒新的顏色?這不是access嗎?也就是說,我們用一棵splay來表示一種顏色 操作2直接在lct上亂搞 不對啊,操作3要查子樹 誒好像是靜態的 那可以考慮線段樹維護dfs序 現在要考慮怎麼維護權值 我們發現開始的時候權值就是節點的深度 而在且只在...

3 28 省選模擬賽 染色 LCT 線段樹

發現和sdoi2017樹點塗色差不多 但是當時這道題模擬賽的時候不會寫 賽後也沒及時訂正 所以這場模擬賽的這道題雖然秒想到了lct和線段樹但是最終還是只是打了暴力。痛定思痛 還是要把這道題給補了。但是對於這道題來說 暴力還是有價值的。考慮20分 每次暴力dfs.考慮對於樹是隨機生成的 那麼期望高度為...

Foreign 資料結構C 線段樹

首先,d操作為刪除操作顯然不可做,又發現這道題可以離線處理,那麼我們考慮倒著來,維護加入操作。那麼這時候,d操作就變為了合併操作,那麼這時候我們只需要維護乙個 可以支援單點修改 查詢第 k 大 資訊可合併的資料結構即可。顯然構建若干棵權值線段樹即可!對於每個聯通塊維護一棵線段樹,用並查集判斷兩點是否...