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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ3083: 遥远的国度(树链剖分)

發(fā)布時間:2024/8/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ3083: 遥远的国度(树链剖分) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意

$n$個節(jié)點的樹,每個點有權(quán)值,支持三種操作

1、 換根

2、把$x$到$y$路徑上節(jié)點權(quán)值變?yōu)?z$

3、詢問路徑最小值

Sol

啥?你說這是TopTree的裸題?那你寫去啊

很顯然,如果沒有第一個操作就是樹剖的裸題

其實有了第一個操作也是樹剖的裸題

我們考慮換根之后會對那些節(jié)點產(chǎn)生影響

以下圖片來自(https://blog.csdn.net/lcomyn/article/details/45718295)

第一種情況:x == root

很顯然直接查詢子樹的最小值就行

?

第二種情況:$lca(x,root) != x$

這種情況也簡單,直接查詢$x$子樹中的最小值即可

第三種情況:$lca(x,root) = x$

這種情況稍微復(fù)雜一些

我們需要找到$root$往上走,離$x$最近的點。

很顯然,這個點以上的部分,就是我們要查詢的區(qū)間

那么我們查詢這個點的子樹對應(yīng)區(qū)間的補集即可

#include<cstdio> #include<vector> #include<algorithm> using namespace std; const int MAXN = 1e5 + 10, B = 20, INF = 2147483646; inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f; } int N, M, root = 1; int a[MAXN], b[MAXN]; vector<int> v[MAXN]; int fa[MAXN], top[MAXN], jump[MAXN][21], deep[MAXN], siz[MAXN], l[MAXN], r[MAXN], tot = 0, cnt, son[MAXN], ID[MAXN]; void dfs1(int x, int _fa) {fa[x] = _fa; siz[x] = 1; l[x] = ++cnt; jump[x][0] = fa[x];for(int i = 0; i < v[x].size(); i++) {int to = v[x][i];if(deep[to]) continue;deep[to] = deep[x] + 1;dfs1(to, x);siz[x] += siz[to];if(siz[to] > siz[son[x]]) son[x] = to;}r[x] = cnt; } void dfs2(int x, int topf) {top[x] = topf; ID[x] = ++tot; a[tot] = b[x];l[x] = tot;if(!son[x]) {r[x] = tot; return ;}dfs2(son[x], topf);for(int i = 0; i < v[x].size(); i++) {int to = v[x][i];if(top[to]) continue;dfs2(to, to);}r[x] = tot; } void Pre() {for(int i = 1; i <= B; i++) for(int j = 1; j <= N; j++)jump[j][i] = jump[jump[j][i - 1]][i - 1]; } #define ls k << 1 #define rs k << 1 | 1 struct Node {int l, r, mi, si, tag; }T[MAXN * 4]; void update(int k) {T[k].mi = min(T[ls].mi, T[rs].mi);} void ps(int k, int val) {T[k].mi = val; T[k].tag = val; return ;} void pushdown(int k) {if(!T[k].tag) return;ps(ls, T[k].tag); ps(rs, T[k].tag);T[k].tag = 0; } void Build(int k, int ll, int rr) {T[k].l = ll; T[k].r = rr; T[k].si = r - l + 1;if(ll == rr) {T[k].mi = a[ll]; return ;}int mid = ll + rr >> 1;Build(ls, ll, mid); Build(rs, mid + 1, rr);update(k); } void IntervalMem(int k, int ll, int rr, int val) {if(ll <= T[k].l && T[k].r <= rr) {T[k].mi = T[k].tag = val;return;}pushdown(k);int mid = T[k].l + T[k].r >> 1;if(ll <= mid) IntervalMem(ls, ll, rr, val);if(rr > mid) IntervalMem(rs, ll, rr, val);update(k); } void TreeChange(int x, int y, int val) {while(top[x] != top[y]) {if(deep[top[x]] < deep[top[y]]) swap(x, y);IntervalMem(1, ID[top[x]], ID[x], val);x = fa[top[x]];}if(deep[x] < deep[y]) swap(x, y);IntervalMem(1, ID[y], ID[x], val); } int IntervalMin(int k, int ll, int rr) {int ans = INF;if(ll <= T[k].l && T[k].r <= rr) return T[k].mi; pushdown(k);int mid = (T[k].l + T[k].r) >> 1;if(ll <= mid) ans = min(ans, IntervalMin(ls, ll, rr));if(rr > mid) ans = min(ans, IntervalMin(rs, ll, rr));return ans; } int LCA(int x, int y) {while(top[x] != top[y]) {if(deep[top[x]] < deep[top[y]]) swap(x, y); x = fa[top[x]];}if(deep[x] < deep[y]) swap(x, y);return y; } int Find(int rt, int x) {for(int i = B; i >= 0; i--) while(deep[jump[rt][i]] > deep[x])rt = jump[rt][i]; return rt; } int Query(int x) {if(x == root) return T[1].mi;int lca = LCA(x, root);if(lca != x) return IntervalMin(1, l[x], r[x]);int v = Find(root, x), ans = INF;if(l[v] > 1) ans = min(ans, IntervalMin(1, 1, l[v] - 1));//tagif(r[v] < N) ans = min(ans, IntervalMin(1, r[v] + 1, tot));return ans; } int main() {N = read(); M = read();for(int i = 1; i <= N - 1; i++) {int x = read(), y = read();v[x].push_back(y); v[y].push_back(x);}for(int i = 1; i <= N; i++) b[i] = read();root = read(); deep[1] = 1; dfs1(1, 0); dfs2(1, 1);Pre(); Build(1, 1, tot); while(M--) {int opt = read();if(opt == 1) root = read();else if(opt == 2){int x1 = read(), x2 = read(), v = read();TreeChange(x1, x2, v);} else {int x = read();printf("%d\n", Query(x));}}return 0; } /* 3 7 1 2 1 3 1 2 3 1 3 1 2 1 1 6 3 1 2 2 2 5 3 1 2 3 3 4 3 1 */

?

轉(zhuǎn)載于:https://www.cnblogs.com/zwfymqz/p/9364916.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的BZOJ3083: 遥远的国度(树链剖分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕有码在线 | 草逼视频免费看 | 黄色片99 | 五月天婷婷社区 | 中国人与拘一级毛片 | 国产1页| 午夜精品久久久久久久久久久久久 | 中文字幕在线播放视频 | 国产 日韩 欧美 成人 | 秋霞成人 | av88av | 久久视频免费在线观看 | 国产原创剧情av | 日韩av电影手机在线观看 | 欧美极品少妇xxxxⅹ裸体艺术 | 美女脱了内裤喂我喝尿视频 | 国产白浆一区二区 | 亚洲精品在线观 | av性在线 | 国产日韩欧美精品一区 | 男男gay同性三级 | 国产乱码一区二区三区 | 91精品国产高清一区二区三区蜜臀 | 又黄又爽网站 | 美脚の诱脚舐め脚视频播放 | 黄大色黄大片女爽一次 | 人人妻人人玩人人澡人人爽 | 黄色成人在线播放 | 亚洲欧美视频二区 | 国产熟女一区二区三区五月婷 | 欧美看片| 精品区一区二区 | 国产成人在线播放 | 新婚若妻侵犯中文字幕 | 欧美日韩一区二区三区免费 | 女攻总攻大胸奶汁(高h) | 亚洲av无码一区二区乱孑伦as | 国产精品久久久久久妇女6080 | 免费在线观看av网址 | 美女久久视频 | 激情啪啪网站 | 极品少妇xxxx| 99热99精品 | 免费一级全黄少妇性色生活片 | 欧美黑人xxxⅹ高潮交 | 97黄色网 | 欧美黄色一级网站 | 日韩在线三级 | 校园激情亚洲 | 东凛在线观看 | 屁屁影院第一页 | 国产免费一区二区三区在线观看 | 97热视频| 福利视频在线免费观看 | 亚洲国产精品自拍 | 中文字幕久久久久久久 | 欧美 丝袜 自拍 制服 另类 | 亚洲一区二区三区电影在线观看 | 成av人片一区二区三区久久 | 日韩精品欧美精品 | 91亚洲国产成人精品一区二三 | 亚洲视频一区二区在线观看 | 一区二区天堂 | 91九色蝌蚪在线 | 亚洲av区无码字幕中文色 | 国产午夜免费 | 综合国产一区 | 国产成人免费电影 | 午夜激情视频在线播放 | 很黄的性视频 | 男人天堂2019| 亚洲福利社区 | 日韩和欧美的一区二区 | 生活片一级片 | 国产激情图片 | 女人下部全棵看视频 | 欧美日韩系列 | 天天草天天射 | 麻豆亚洲av熟女国产一区二 | 亚洲狼人天堂 | 蜜臀av在线免费观看 | 国产人妻精品一区二区三区不卡 | jizzjizz在线播放| 日韩一级片免费 | 国产色在线视频 | 欧美变态口味重另类 | 中文字幕久久久久 | 亚洲精品女人久久久 | 人妻 日韩 欧美 综合 制服 | 五月激情丁香 | 91刺激| 亚洲精品一区二区三区在线 | 欧美特黄一级大片 | 日本老熟妇毛茸茸 | www.亚色 | 精品一区二区三区视频日产 | 人妻偷人精品一区二区三区 | 夜夜操免费视频 | 三级a做爰全过程 |