多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > hdu 4757 Tree(可持久化字典樹)

hdu 4757 Tree(可持久化字典樹)

來源:程序員人生   發布時間:2014-11-04 08:28:18 閱讀次數:3406次

題目鏈接:hdu 4757 Tree

題目大意:給定1棵樹,每一個節點有1個值,現在有Q次詢問,每次詢問u到v路徑上節點值與w亦或值的最大值。

解題思路:剛開始以為是樹鏈剖分,其實樹鏈剖分只是用來求LCA(可以不用樹鏈剖分)。

可持久化字典樹,在每次插入的同時,不修改本來的節點,而是對所有修改的節點復制1個新的節點,并且在新的節點

上做操作,這樣做的目的是能夠獲得某次修改前的狀態。同過可持久化的操作,保存了修改前后的公共數據。

對給定樹上的所有節點權值建立01字典樹,然后每一個節點都保存著1棵可持久化字典樹,表示的是從根節點到該節點路

徑節點所構成的字典樹。對每一個節點建樹的進程通過修改其父親節點而得到。

查詢時,對根據u,v,lca(u,v)3棵字典樹的情況肯定亦或的最大值,注意lca(u,v)這個節點要單獨計算。

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N, Q, E, V[maxn], first[maxn], jump[maxn * 2], link[maxn * 2]; int id, idx[maxn], top[maxn], far[maxn], son[maxn], dep[maxn], cnt[maxn]; inline void add_Edge (int u, int v) { link[E] = v; jump[E] = first[u]; first[u] = E++; } inline void dfs (int u, int pre, int d) { far[u] = pre; son[u] = 0; dep[u] = d; cnt[u] = 1; for (int i = first[u]; i + 1; i = jump[i]) { int v = link[i]; if (v == pre) continue; dfs(v, u, d + 1); cnt[u] += cnt[v]; if (cnt[son[u]] < cnt[v]) son[u] = v; } } inline void dfs (int u, int rot) { idx[u] = ++id; top[u] = rot; if(son[u]) dfs(son[u], rot); for (int i = first[u]; i + 1; i = jump[i]) { int v = link[i]; if (v == far[u] || v == son[u]) continue; dfs(v, v); } } inline int LCA (int u, int v) { int p = top[u], q = top[v]; while (p != q) { if (dep[p] < dep[q]) { swap(p, q); swap(u, v); } u = far[p]; p = top[u]; } return dep[u] > dep[v] ? v : u; } void init() { E = id = 0; memset(first, -1, sizeof(first)); for (int i = 1; i <= N; i++) scanf("%d", &V[i]); int u, v; for (int i = 1; i < N; i++) { scanf("%d%d", &u, &v); add_Edge(u, v); add_Edge(v, u); } dfs(1, 0, 0); dfs(1, 1); } struct node { int g[2], c; }nd[maxn * 20]; int sz, root[maxn]; int insert (int r, int w) { int ret, x; ret = x = sz++; nd[x] = nd[r]; for (int i = 15; i >= 0; i--) { int v = (w>>i)&1; int t = sz++; nd[t] = nd[nd[x].g[v]]; nd[t].c++; nd[x].g[v] = t; x = t; } return ret; } void dfs(int u) { root[u] = insert(root[far[u]], V[u]); for (int i = first[u]; i + 1; i = jump[i]) { int v = link[i]; if (v == far[u]) continue; dfs(v); } } void Tire_init() { sz = 1; root[0] = nd[0].c = 0; memset(nd[0].g, 0, sizeof(nd[0].g)); dfs(1); } int query(int x, int y, int z, int w) { int ans = V[z] ^ w, ret = 0; z = root[z]; for (int i = 15; i >= 0; i--) { int v = ((w>>i)&1) ^ 1; int cnt = nd[nd[x].g[v]].c + nd[nd[y].g[v]].c - 2 * nd[nd[z].g[v]].c; if (cnt) ret |= (1<<i); else v = v^1; x = nd[x].g[v], y = nd[y].g[v], z = nd[z].g[v]; } return max(ans, ret); } int main () { while (scanf("%d%d", &N, &Q) == 2) { init(); Tire_init(); int u, v, w; while (Q--) { scanf("%d%d%d", &u, &v, &w); printf("%d ", query(root[u], root[v], LCA(u, v), w)); } } return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 色综合天天综合网国产成人 | 中文字幕一区二区三区免费看 | 国内精品久久久久影 | 黄色的网站免费观看 | 久国产| www.91视频.com| 亚洲精品欧美精品一区二区 | 日韩精品久久一区二区三区 | 老外一级毛片免费看 | 亚洲综合在线观看视频 | 天堂亚洲欧美日韩一区二区 | 亚洲天堂网站在线 | 视频在线观看免费网址 | 欧美成人国产一区二区 | 国产精品久久久久国产精品三级 | 成人国产日本亚洲精品 | 欧美精品久久久久久久久大尺度 | 久久三级视频 | 久久精品国产线看观看亚洲 | 亚洲黄色在线观看视频 | 黄色天堂在线 | 日韩一级视频免费观看 | 久久永久免费视频 | 欧美在线一区二区三区不卡 | 国产日韩欧美一区 | free日本xxxx另类hd | 在线观看成年人视频网站 | 国内在线观看精品免费视频 | 男女污视频在线观看 | 伊人色院成人蜜桃视频 | 欧美性狂猛bbbbbbxxxx | 欧美另类极品 | 欧美成人午夜在线全部免费 | 国产日韩欧美综合一区二区三区 | 性欧美xxxx性| 免费一级毛片私人影院a行 免费一级毛片一级毛片aa | 国产成人精品曰本亚洲78 | 成人性色生活片免费看爆迷你毛片 | 2022偷拍午夜视频在线播放 | 欧美成人精品第一区 | 国产精品成人扳一级aa毛片 |