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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3)

發布時間:2023/12/3 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

luogu 2486
金牌導航 樹鏈剖分-3


題目大意

給你一棵樹,讓你進行以下操作:
1.把一條路徑染上一個顏色
2.查詢一條路徑上有多少個顏色段


解題思路

用樹鏈剖分把問題轉化為鏈上問題

然后維護一下左右端點顏色和顏色總數就好了


代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 100010 using namespace std; int n, m, x, y, z, w, tot; int c[N], q[N], hs[N], fa[N], sz[N], fq[N], top[N], dep[N], head[N]; char str[100]; struct rec {int to, next; }a[N<<1]; struct node {int ln, rn, cn; }; node merge(node a, node b)//合并兩段 {node h;h.ln = a.ln;h.rn = b.rn;h.cn = a.cn + b.cn - (a.rn == b.ln);return h; } void swapp(node &a, node &b) {node h = a;a = b;b = h;return; } void add(int x, int y) {a[++tot].to = y;a[tot].next = head[x];head[x] = tot;return; } struct Tree {#define ls x*2#define rs x*2+1node v[N<<2];int lazy[N<<2];void push_up(int x){v[x] = merge(v[ls], v[rs]);return;}void build(int x, int l, int r){lazy[x] = -1;if (l == r){v[x] = (node){c[fq[l]], c[fq[l]], 1};return;}int mid = l + r >> 1;build(ls, l, mid);build(rs, mid + 1, r);push_up(x);}void push_down(int x){if (lazy[x] != -1){lazy[ls] = lazy[rs] = lazy[x];v[ls] = v[rs] = (node){lazy[x], lazy[x], 1};lazy[x] = -1;}return;}void change(int x, int L, int R, int l, int r, int y){if (L == l && R == r){lazy[x] = y;v[x] = (node){y, y, 1};return;}int mid = L + R >> 1;push_down(x);if (r <= mid) change(ls, L, mid, l, r, y);else if (l > mid) change(rs, mid + 1, R, l, r, y);else change(ls, L, mid, l, mid, y), change(rs, mid + 1, R, mid + 1, r, y);push_up(x);return;}node ask(int x, int L, int R, int l, int r){if (L == l && R == r) return (node){v[x].ln, v[x].rn, v[x].cn};int mid = L + R >> 1;push_down(x);if (r <= mid) return ask(ls, L, mid, l, r);else if (l > mid) return ask(rs, mid + 1, R, l, r);else return merge(ask(ls, L, mid, l, mid), ask(rs, mid + 1, R, mid + 1, r));} }T; void dfs1(int x) {sz[x] = 1;dep[x] = dep[fa[x]] + 1;for (int i = head[x]; i; i = a[i].next)if (a[i].to != fa[x]){fa[a[i].to] = x;dfs1(a[i].to);sz[x] += sz[a[i].to];if (sz[a[i].to] > sz[hs[x]]) hs[x] = a[i].to;}return; } void dfs2(int x, int y) {q[x] = ++w;fq[w] = x;top[x] = y;if (hs[x]) dfs2(hs[x], y);for (int i = head[x]; i; i = a[i].next)if (a[i].to != fa[x] && a[i].to != hs[x])dfs2(a[i].to, a[i].to);return; } void solve(int x, int y, int z) {while(top[x] != top[y]){if (dep[top[x]] < dep[top[y]]) swap(x, y);T.change(1, 1, n, q[top[x]], q[x], z);x = fa[top[x]];}if (dep[x] > dep[y]) swap(x, y);T.change(1, 1, n, q[x], q[y], z);return; } int ask(int x, int y) {int pa = 0, pb = 0;node na, nb;while(top[x] != top[y]){if (dep[top[x]] < dep[top[y]]){swap(pa, pb);swapp(na, nb);swap(x, y);}if (!pa) na = T.ask(1, 1, n, q[top[x]], q[x]), pa = 1;else na = merge(T.ask(1, 1, n, q[top[x]], q[x]), na);x = fa[top[x]];}if (dep[x] > dep[y]){swap(pa, pb);swapp(na, nb);swap(x, y);}if (!pb) nb = T.ask(1, 1, n, q[x], q[y]), pb = 1;else nb = merge(T.ask(1, 1, n, q[x], q[y]), nb);if (!pa) return nb.cn;else if (!pb) return na.cn;else return merge((node){na.rn, na.ln, na.cn}, nb).cn;//連接點對上 } int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i)scanf("%d", &c[i]);for (int i = 1; i < n; ++i){scanf("%d%d", &x, &y);add(x, y);add(y, x);}dfs1(1);dfs2(1, 1);T.build(1, 1, n);while(m--){scanf("%s", str);if (str[0] == 'C'){scanf("%d%d%d", &x, &y, &z);solve(x, y, z);}else{scanf("%d%d", &x, &y);printf("%d\n", ask(x, y));}}return 0; }

總結

以上是生活随笔為你收集整理的【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 巨胸大乳www视频免费观看 | 黄色福利网站 | 欧美无砖区 | 一本一道久久a久久精品综合 | 中文字幕二区 | 欧美激情久久久 | 中文字幕在线播放日韩 | 福利片av| 中文字幕色网 | 肥臀熟女一区二区三区 | 一级片网址 | 成人动漫在线播放 | 朴银狐电影中文在线看 | 黄色网址视频 | 久久777| 反差在线观看免费版全集完整版 | 日本女优一区 | 黑人3p波多野结衣在线观看 | 天堂婷婷 | 男女一区二区三区 | 日本护士取精xxxxxhd | 看av网站 | 国产人与zoxxxx另类 | 欲求不满在线小早川怜子 | 日本三级日本三级日本三级极 | 不卡日本 | 亚洲视频天天射 | 久久久久噜噜噜亚洲熟女综合 | 黄色av播放 | 日韩女人性猛交 | 天天鲁一鲁摸一摸爽一爽 | 欧美一区二区三区粗大 | 成人免费毛片足控 | 深爱激情久久 | 午夜福利电影一区二区 | 国产精品11 | 小柔的淫辱日记(h | 天堂视频免费看 | 福利在线视频观看 | 青娱乐在线视频免费观看 | 成人依依网| 黑人超碰| 亚洲在线日韩 | 中文字幕18页 | 成人av教育 | 日韩三级视频 | 国内精品免费视频 | 一区二区三区中文字幕在线观看 | 成人av入口 | 一级裸体片| 粉嫩av.com| 国产精品美女久久久久久久久 | 乱一色一乱一性一视频 | 伊人久久免费视频 | 伊人av影院 | 欧美在线观看一区二区 | 国产盗摄一区二区三区在线 | av激情在线 | 在线观看免费黄网站 | av免费观看在线 | 色播在线播放 | 日韩在线免费视频观看 | 一区二区日本视频 | 国产无码精品久久久 | 国产人免费人成免费视频 | 国产精品国产精品国产专区 | 久久精品2019中文字幕 | 色伊人| 日本学生初尝黑人巨免费视频 | 色婷婷中文字幕 | 久久丁香| 午夜高清 | 欧美 日韩 国产 在线观看 | 午夜神马影院 | 亚洲午夜久久久久久久久 | 91在线免费看片 | 亚洲系列第一页 | 91亚洲精品国偷拍 | 97se在线 | 亚州精品国产精品乱码不99按摩 | 伊人22| 搞逼综合网 | 色偷偷888欧美精品久久久 | 羞羞的视频网站 | av导航在线 | 色偷偷伊人 | 欧美一区二区三 | 手机天堂av | 久久久久国产一区二区三区 | 亚洲精品午夜国产va久久成人 | 一本大道久久久久精品嫩草 | 亚洲精品一区二区潘金莲 | 婷婷丁香九月 | 五月丁香久久婷婷 | 免费观看一级视频 | 日本少妇一区二区 | 夜夜躁日日躁狠狠久久av | 欧美淫| 土耳其xxxx性hd极品 |