詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。
我們將邊兩端的點顏色相同的邊設為實邊,不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。
那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在lct進行access的時候進行+-1修改,然後詢問的時候用區間求和求得答案即可。
1 #include2 #includeview code3 #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 }
SDOI2017 樹點染色 線段樹 LCT
本來只是想練練lct,沒想到是個線段樹 對於操作1 誒新的顏色?這不是access嗎?也就是說,我們用一棵splay來表示一種顏色 操作2直接在lct上亂搞 不對啊,操作3要查子樹 誒好像是靜態的 那可以考慮線段樹維護dfs序 現在要考慮怎麼維護權值 我們發現開始的時候權值就是節點的深度 而在且只在...
3 28 省選模擬賽 染色 LCT 線段樹
發現和sdoi2017樹點塗色差不多 但是當時這道題模擬賽的時候不會寫 賽後也沒及時訂正 所以這場模擬賽的這道題雖然秒想到了lct和線段樹但是最終還是只是打了暴力。痛定思痛 還是要把這道題給補了。但是對於這道題來說 暴力還是有價值的。考慮20分 每次暴力dfs.考慮對於樹是隨機生成的 那麼期望高度為...
Foreign 資料結構C 線段樹
首先,d操作為刪除操作顯然不可做,又發現這道題可以離線處理,那麼我們考慮倒著來,維護加入操作。那麼這時候,d操作就變為了合併操作,那麼這時候我們只需要維護乙個 可以支援單點修改 查詢第 k 大 資訊可合併的資料結構即可。顯然構建若干棵權值線段樹即可!對於每個聯通塊維護一棵線段樹,用並查集判斷兩點是否...