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

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

生活随笔

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

编程问答

树链剖分解析---WYD

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树链剖分解析---WYD 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,樹(shù)鏈剖分是個(gè)什么東西?
給出一道例題:維護(hù)兩個(gè)操作:
1,修改單點(diǎn)值;2,求x~y路徑的權(quán)值和;
點(diǎn)數(shù)<=100000,操作數(shù)量<=100000.
考慮LCA?不行,LCA不能支持修改,極限復(fù)雜度(N*N),于是…
接下來(lái),引出數(shù)據(jù)結(jié)構(gòu)-----樹(shù)鏈剖分。

定義與概念:(劃重點(diǎn))
重兒子:父親節(jié)點(diǎn)的所有兒子中子樹(shù)結(jié)點(diǎn)數(shù)目最多(size最大)的結(jié)點(diǎn);
輕兒子:父親節(jié)點(diǎn)中除了重兒子以外的兒子;
重邊:父親結(jié)點(diǎn)和重兒子連成的邊;
輕邊:父親節(jié)點(diǎn)和輕兒子連成的邊;
重鏈:由多條重邊連接而成的路徑;
輕鏈:由多條輕邊連接而成的路徑;

請(qǐng)花至少五分鐘理解之,上圖:

進(jìn)行變量聲明:
size[v]代表以v為根的子樹(shù)的節(jié)點(diǎn)數(shù)
dep[v]代表v的深度(根深度為1)
top[v]代表v所在的鏈頂頂端節(jié)點(diǎn)的編號(hào)
fa[v]代表v的父親,son[v]代表v的重兒子。
tree[v]代表節(jié)點(diǎn)v在線(xiàn)段樹(shù)(數(shù)據(jù)結(jié)構(gòu))中的編號(hào)(dfs序)
pre[v]代表線(xiàn)段樹(shù)(數(shù)據(jù)結(jié)構(gòu))中編號(hào)為v的節(jié)點(diǎn)所對(duì)應(yīng)的原圖中的點(diǎn)編號(hào)(tree[v]與pre[v]是互逆的,tree[2]=3,則pre[3]=2.)
開(kāi)始樹(shù)鏈剖分!

Top1:dg1
此遞歸可以一舉求出size,dep,fa與son。
其中dep[f[k][1]]=dep[t]+1,fa[f[k][1]]=t,size[t]+=size[f[k][1]];
son[t]只需通過(guò)比較size[f[k][1]]即可得出。(f[k][1]是t的一個(gè)兒子)
注意:
如果有多個(gè)最大size,任選一個(gè);
葉節(jié)點(diǎn)無(wú)重兒子,非葉節(jié)點(diǎn)有且只有一個(gè)重兒子
標(biāo)程:

void dg1(int t) {size[t]=1;//點(diǎn)本身size=1;for (int k=q[t];k;k=ff[k][2]) {int h=ff[k][1];//ff[k][1]是前向星中t的一個(gè)兒子if (h!=fa[t]) {fa[h]=t,dep[h]=dep[t]+1;//求fa與depdg1(h);size[t]+=size[h];//求sizeif ((!son[t])||(size[son[t]]<size[h])) son[t]=h;//求son,選擇兒子中最大的size}} } //dg1跑完上圖后如此: size 14 5 2 6 1 3 1 1 3 1 1 1 2 1 son 4 6 7 9 0 11 0 0 13 0 0 0 0 0fa 0 1 1 1 2 2 3 4 4 4 6 6 9 13 dep 1 2 2 3 3 3 3 3 3 4 4 4 4 4

Top2:dg2
求出tree,pre與top。
為了用數(shù)據(jù)結(jié)構(gòu)維護(hù)重鏈,我們要讓重鏈的DFS序連續(xù)
標(biāo)程:

void dg2(int t,int ad) {tot++;tree[t]=tot,pre[tot]=t,top[t]=ad;//求tree與pre,tree[x]=y則pre[y]=x;if (!son[t]) return;dg2(son[t],ad);//優(yōu)先遞歸重兒子,讓重鏈DFS序連續(xù)for (int k=q[t];k;k=ff[k][2]) {int h=ff[k][1];//dg1中已解釋if ((h!=fa[t])&&(h!=son[t])) dg2(h,h);//如果一個(gè)點(diǎn)位于輕鏈頂端,則它的鏈頂節(jié)點(diǎn)為本身} } //dg2跑完上圖后如此 top 1 2 3 1 5 2 7 8 1 10 2 12 1 1 tree 1 10 8 2 14 11 9 6 3 7 12 13 4 5 pre 1 4 9 13 14 8 10 3 7 2 6 11 12 5

好了,樹(shù)鏈剖分結(jié)束了。

WTF?這就結(jié)束了?說(shuō)好150+行的代碼呢?

是的,樹(shù)鏈剖分的主要操作已經(jīng)結(jié)束,我們將樹(shù)轉(zhuǎn)換成了一條條的鏈加以維護(hù)。
不過(guò),還有一個(gè)遺留難題:為什么樹(shù)鏈剖分的時(shí)間復(fù)雜度是O(nlog^2n)?
有兩條性質(zhì):
1.若(u,v)為輕邊(u是v父親),則size[u]>size[v]*2。
這個(gè)顯然,如果不滿(mǎn)足size[u]>size[v]*2,size[v]必然不小于其它兒子的size,那么(u,v)不該是輕邊。
2.從根結(jié)點(diǎn)到任意結(jié)點(diǎn)的路所經(jīng)過(guò)的輕重鏈的個(gè)數(shù)必定都小與O(logn);
這個(gè)不顯然,但易證。
先證輕鏈:因?yàn)?性質(zhì),如果(u,v)為輕邊,從u到v的size至少減一半;
那么最多只能經(jīng)過(guò)log(n)層。
重鏈與輕鏈?zhǔn)遣⑿械?#xff0c;所以重鏈最多有l(wèi)og(n)+1條
證畢。
對(duì)于這些鏈,用線(xiàn)段樹(shù)維護(hù)即可。
模板題:JZOJ2256 ZJOI2008 樹(shù)的統(tǒng)計(jì)

#include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> using namespace std; int i,j,k,m,n,o,p,l,s,t,x,y,tot; struct node{int sum,max,l,r;}f[1200001]; int ff[600001][3],q[600001],fa[300001],son[300001],dep[300001],size[300001]; int top[300001],tree[300001],pre[300001],a[300001]; char ch[7]; void insert(int x,int y) { t++,ff[t][1]=y,ff[t][2]=q[x],q[x]=t; } void downdata(int x) {int xx=x*2,yy=x*2+1;f[x].sum=f[xx].sum+f[yy].sum;f[x].max=max(f[xx].max,f[yy].max); } void change(int x,int v,int ad) {if (f[x].l==f[x].r) f[x].max=ad,f[x].sum=ad;else {int mid=(f[x].l+f[x].r)/2;if (v<=mid) change(x*2,v,ad); else change(x*2+1,v,ad);downdata(x);} } void make(int x,int l,int r) {f[x].l=l,f[x].r=r;if (l==r) f[x].sum=f[x].max=a[pre[l]];else {int mid=(l+r)/2;make(x*2,l,mid);make(x*2+1,mid+1,r);downdata(x);} } void dg1(int t) {size[t]=1;for (int k=q[t];k;k=ff[k][2]) {int h=ff[k][1];if (h!=fa[t]) {fa[h]=t,dep[h]=dep[t]+1;dg1(h);size[t]+=size[h];if ((!son[t])||(size[son[t]]<size[h])) son[t]=h;}} } void dg2(int t,int ad) {tot++;tree[t]=tot,pre[tot]=t,top[t]=ad;if (!son[t]) return;dg2(son[t],ad);for (int k=q[t];k;k=ff[k][2]) {int h=ff[k][1];if ((h!=fa[t])&&(h!=son[t])) dg2(h,h);} } int getsum(int t,int x,int y) {if ((f[t].l>=x)&&(f[t].r<=y)) return f[t].sum;int mid=(f[t].l+f[t].r)/2,sum=0;if (x<=mid) sum+=getsum(t*2,x,y);if (y>mid) sum+=getsum(t*2+1,x,y);return sum; } int getmax(int t,int x,int y) {if ((f[t].l>=x)&&(f[t].r<=y)) return f[t].max;int mid=(f[t].l+f[t].r)/2,Max=-2147483648;if (x<=mid) Max=max(Max,getmax(t*2,x,y));if (y>mid) Max=max(Max,getmax(t*2+1,x,y));return Max; } int findmax(int x,int y) {int xx=top[x],yy=top[y],maxans=-2147483648;while (xx!=yy) {if (dep[xx]<dep[yy]) swap(xx,yy),swap(x,y);maxans=max(maxans,getmax(1,tree[xx],tree[x]));x=fa[xx],xx=top[x];} if (dep[x]>dep[y]) swap(x,y);maxans=max(maxans,getmax(1,tree[x],tree[y]));return maxans; } int findsum(int x,int y) {int xx=top[x],yy=top[y],sumans=0;while (xx!=yy) {if (dep[xx]<dep[yy]) swap(xx,yy),swap(x,y);sumans+=getsum(1,tree[xx],tree[x]);x=fa[xx],xx=top[x];} if (dep[x]>dep[y]) swap(x,y);sumans+=getsum(1,tree[x],tree[y]);return sumans; } int main() {scanf("%d",&n);for (i=1;i<=n-1;i++) {scanf("%d%d",&x,&y);insert(x,y);insert(y,x);}for (i=1;i<=n;i++) scanf("%d",&a[i]);t=0;dep[1]=1;dg1(1);dg2(1,1);make(1,1,n);scanf("%d",&m);for (i=1;i<=m;i++) {scanf("%s",&ch);scanf("%d%d",&x,&y);if (ch[1]=='H') {change(1,tree[x],y);} else {printf("%d\n",ch[1]=='M'?findmax(x,y):findsum(x,y));}} }

總結(jié)

以上是生活随笔為你收集整理的树链剖分解析---WYD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 四虎影院一区 | 国产suv精品一区二区 | 五月av| 91美女视频在线观看 | 五月涩 | 加勒比精品在线 | 亚洲亚洲人成综合网络 | 精品一区二区免费看 | 严厉高冷老师动漫播放 | 国产香蕉尹人视频在线 | 欧美黄色免费看 | 91精品国产电影 | 国产精品久久久久久久专区 | 精品午夜视频 | 日本欧美国产在线 | 午夜精品网站 | 后入内射无码人妻一区 | 日韩精品在线播放 | 欧美 唯美 清纯 偷拍 | 波多野结衣乳巨码无在线观看 | 国产xxx在线 | 少妇免费毛片久久久久久久久 | xxx69美国| 日本www高清| 新红楼梦2005锦江版高清在线观看 | 伊人涩涩| 天天躁日日躁狠狠很躁 | 色综合天 | 久久久com | 日韩av一区在线播放 | 波多野结衣乳巨码无在线观看 | 国产精品福利一区二区 | 人人操在线播放 | 911亚洲精品| 色综合网址 | 国产成人在线视频播放 | 欧美精品一区在线观看 | 成人免费视频国产免费网站 | 一区二区三区av | 裸体美女免费视频网站 | 激情文学8888 | 欧美色图88 | www.亚洲一区二区 | 欧美性猛交xxxx黑人 | 深夜视频在线看 | 国产乱淫精品一区二区三区毛片 | 亚洲国产精品成人无久久精品 | 91插插视频 | 天美视频在线观看 | 日本乱轮视频 | 女教师高潮黄又色视频 | 亚洲啊v| 色婷婷狠狠爱 | 美女毛片在线 | 久久久天天 | 国产婷婷一区二区三区久久 | 北京少妇xxxx做受 | 涩涩99| 99免费在线观看视频 | 亚洲欧洲国产视频 | 动漫精品一区一码二码三码四码 | 亚洲精品一二三四 | 精品人妻一区二区三区四区久久 | 国产精品一区二 | 一区二区有码 | 福利资源在线观看 | 农村妇女精品一区二区 | 插我一区二区在线观看 | 密桃成熟时在线观看 | 国产精品视频一区二区三区, | 巨胸爆乳美女露双奶头挤奶 | 欧美 日韩 视频 | 午夜精品网 | 国产福利精品视频 | 91在线观看成人 | 丁香免费视频 | 秋霞毛片少妇激情免费 | 国产精品视频合集 | 综合五月婷婷 | 日本黄图| 91麻豆精品国产 | 色综合狠狠爱 | 国产一区二区三区在线视频 | 久久人人妻人人人人妻性色av | 色婷婷av一区二区三区麻豆综合 | 色福利hd写真video | 偷拍视频一区 | av福利站| 欧美xxxⅹ性欧美大片 | 插吧插吧综合网 | 久草国产在线观看 | 日本在线免费看 | 少妇久久久久久被弄到高潮 | 嫩草影院久久 | 动漫美女被艹 | 欧美精品第一页 | 欧美激情另类 | 污网站免费观看 | 成人在线观看免费视频 |