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

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

生活随笔

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

编程问答

BZOJ 4448 主席树+树链剖分(在线)

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

為什么題解都是離線的…… (抄都沒(méi)法抄)
搞一棵主席樹(shù)
1 操作 新樹(shù)上的當(dāng)前節(jié)點(diǎn)設(shè)成1
2 操作 查max(i-xx-1,0)那棵樹(shù)上這條路徑上有多少個(gè)點(diǎn)是1
讓你找經(jīng)過(guò)了多少個(gè)點(diǎn) 查的時(shí)候用deep 搞出來(lái)就好了

//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 444444 #define mem(x,y) memset(x,y,sizeof(x)) int n,q,op,xx,yy,zz,first[N],v[N],next[N],tot,root,rt[N],ans; int size[N],fa[N],son[N],deep[N],top[N],change[N],back[N],cnt; struct Tree{int l,r,num;}tree[N*30]; void Add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;} void add(int x,int y){Add(x,y),Add(y,x);} void dfs(int x){size[x]=1;for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){deep[v[i]]=deep[x]+1,fa[v[i]]=x,dfs(v[i]);size[x]+=size[v[i]];if(size[son[x]]<size[v[i]])son[x]=v[i];} } void dfs2(int x,int tp){change[x]=++cnt,back[cnt]=x;top[x]=tp;if(son[x])dfs2(son[x],tp);for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]&&v[i]!=son[x])dfs2(v[i],v[i]); } void push_up(int pos){tree[pos].num=tree[tree[pos].l].num+tree[tree[pos].r].num;} int build(int l,int r){int pos=++cnt;if(l==r){return pos;}int mid=(l+r)>>1;tree[pos].l=build(l,mid),tree[pos].r=build(mid+1,r);return pos; } int insert(int o,int l,int r,int num){int pos=++cnt;tree[pos]=tree[o];if(l==r){tree[pos].num=1;return pos;}int mid=(l+r)>>1;if(mid>=num)tree[pos].l=insert(tree[o].l,l,mid,num);else tree[pos].r=insert(tree[o].r,mid+1,r,num);push_up(pos);return pos; } int query(int o,int l,int r,int L,int R){if(l>=L&&r<=R)return tree[o].num;int mid=(l+r)>>1; if(mid<L)return query(tree[o].r,mid+1,r,L,R);else if(mid>=R)return query(tree[o].l,l,mid,L,R);else return query(tree[o].l,l,mid,L,R)+query(tree[o].r,mid+1,r,L,R); } int find(int x,int y,int wei){int fx=top[x],fy=top[y],temp=0;while(fx!=fy){if(deep[fx]<deep[fy])swap(x,y),swap(fx,fy);temp+=query(rt[wei],1,n,change[fx],change[x]),ans+=deep[x]-deep[fx]+1;x=fa[fx],fx=top[x];}if(deep[x]<deep[y])swap(x,y);ans+=deep[x]-deep[y]+1;return temp+query(rt[wei],1,n,change[y],change[x]); } int main(){mem(first,-1);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&fa[i]);if(!fa[i])root=i;else add(i,fa[i]);}dfs(root),dfs2(root,root),cnt=0,rt[0]=build(1,n);scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%d",&op);if(op==1){rt[i]=rt[i-1],ans=0;scanf("%d%d%d",&xx,&yy,&zz);zz=max(i-zz-1,0);printf("%d %d\n",ans,find(xx,yy,zz));}else scanf("%d",&xx),rt[i]=insert(rt[i-1],1,n,change[xx]);} }

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

總結(jié)

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

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