日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【LCT】网络(luogu 2173/ZJOI2011)

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LCT】网络(luogu 2173/ZJOI2011) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

luogu 2173


題目大意

給你一個(gè)圖,每條邊有有一種顏色(numcolor?10num_{color}\leqslant 10numcolor??10),保證以下性質(zhì):

1.一個(gè)點(diǎn)連出的同色邊數(shù)不大于2
2.不存在同色邊組成的環(huán)

現(xiàn)在讓你進(jìn)行3鐘操作:

1.修改一個(gè)點(diǎn)的權(quán)值
2.把兩個(gè)點(diǎn)的連邊換色(如果不存在這條邊,或修改后違背上文的性質(zhì),那么不修改)
3.輸出某一顏色中,一條路徑上的最大值


解題思路

如果只有單顏色,那么可以用LCT維護(hù)一棵樹(shù),所有操作都可以在LCT上進(jìn)行

因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">numcolor?10num_{color}\leqslant 10numcolor??10,所以多顏色建多幾棵LCT即可


代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 10100 using namespace std; int n, m, q, x, y, z, p, cn; struct LCT {int v[N], s[N], p[N], fa[N], deg[N], son[N][2];#define ls son[x][0]#define rs son[x][1]bool NR(int x){return fa[x] && (son[fa[x]][0] == x || son[fa[x]][1] == x);}bool IRS(int x){return son[fa[x]][1] == x;}void push_up(int x){s[x] = max(v[x], max(s[ls], s[rs]));return;}void pushr(int x){swap(ls, rs);p[x] ^= 1;return;}void push_down(int x){if (p[x]){if (ls) pushr(ls);if (rs) pushr(rs);p[x] = 0;}return;}void push_hall(int x){if (NR(x)) push_hall(fa[x]);push_down(x);return;}void rotate(int x){int y = fa[x], z = fa[y], k = IRS(x), g = son[x][!k];if (NR(y)) son[z][IRS(y)] = x;if (g) fa[g] = y;fa[x] = z;fa[y] = x;son[x][!k] = y;son[y][k] = g;push_up(y);return;}void Splay(int x){push_hall(x);while(NR(x)){if (NR(fa[x])){if (IRS(x) == IRS(fa[x])) rotate(fa[x]);else rotate(x);}rotate(x);}push_up(x);return;}void access(int x){for (int y = 0; x; y = x, x = fa[x])Splay(x), rs = y, push_up(x);}void make_root(int x){access(x);Splay(x);pushr(x);return;}int find_root(int x){access(x);Splay(x);while(ls) push_down(x), x = ls;Splay(x);return x;}void Split(int x, int y){make_root(x);access(y);Splay(y);return;}void link(int x, int y){deg[x]++;deg[y]++;make_root(x);if (find_root(y) != x) fa[x] = y;return;}bool cut(int x, int y){make_root(x);if (find_root(y) == x && fa[y] == x && !son[y][0]){deg[x]--;deg[y]--;fa[y] = son[x][1] = 0;push_up(x);return true;}return false;} }T[15];//建多棵樹(shù) int main() {scanf("%d%d%d%d", &n, &m, &cn, &q);for (int i = 1; i <= n; ++i){scanf("%d", &T[0].v[i]);for (int j = 1; j < cn; ++j)T[j].v[i] = T[0].v[i];}for (int i = 1; i <= m; ++i){scanf("%d%d%d", &x, &y, &z);T[z].link(x, y);}while(q--){scanf("%d", &x);if (x == 0){scanf("%d%d", &x, &y);for (int i = 0; i <= cn; ++i)//每種顏色的樹(shù)都要修改{T[i].Splay(x);T[i].v[x] = y;T[i].push_up(x);}}else if (x == 1){scanf("%d%d%d", &x, &y, &z);p = -1;for (int i = 0; i < cn; ++i){if (T[i].cut(x, y))//看是否有這樣一條邊,如果有就先割掉{p = i;break;}}if (p == -1)//沒(méi)有連邊{puts("No such edge.");continue;}if (T[z].deg[x] == 2 || T[z].deg[y] == 2)//超度數(shù){T[p].link(x, y);//連回去puts("Error 1.");continue;}T[z].make_root(x);if (T[z].find_root(y) == x)//已經(jīng)連通了,再連就會(huì)產(chǎn)生環(huán){T[p].link(x, y);puts("Error 2.");continue;}T[z].link(x, y);puts("Success.");}else if (x == 2){scanf("%d%d%d", &z, &x, &y);T[z].make_root(x);if (T[z].find_root(y) != x) puts("-1");else printf("%d\n", T[z].s[x]);}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的【LCT】网络(luogu 2173/ZJOI2011)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。