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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[BZOJ 2588]Count on a tree

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ 2588]Count on a tree 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

LCA+主席樹(可持久化線段樹)

取一個點為根,每棵線段樹記錄樹上節點到根的鏈上的權在數軸上的分布(當然要離散化),

則對于兩個點u,v的路徑上的數在數軸上的分布可以表示為tree[u]+tree[v]-tree[lca(u,v)]-tree[fa(u,v)](可以隨便畫圖YY一下),

然后就可以在得到的樹上查詢了。

?

代碼:

#include<bits/stdc++.h> using namespace std; #define N ((1<<17)-1)int n,m,rv[N],v[N],dep[N],jp[N][20],cnt,p[N]; bool vis[N]; vector<vector<int> >G;struct SN{SN *son[2];int val; }sn[N*20],*root[N];void build(SN&x,int l,int r) {if (l==r) return;int m=(l+r)>>1;x.son[0]=&sn[++cnt];x.son[1]=&sn[++cnt];build(*x.son[0],l,m);build(*x.son[1],m+1,r); }inline bool cmp(int a,int b){return rv[a]<rv[b];}void putin() {int i,x,y;scanf("%d%d",&n,&m);G.resize(n+1);for (i=1;i<=n;i++) scanf("%d",&rv[i]),p[i-1]=i;sort(p,p+n,cmp);for (i=0;i<n;i++) v[p[i]]=i;for (i=0;i<n-1;i++){scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}build(sn[0],0,n-1);root[0]=&sn[0]; }void rebuild(SN&x,int l,int r,int k) {x.val++;if (l==r) return;int m=(l+r)>>1,s;if (k<=m) s=0,r=m;else s=1,l=m+1;sn[++cnt]=*x.son[s];x.son[s]=&sn[cnt];rebuild(*x.son[s],l,r,k); }void dfs(int x,int f,int d) {int i;vis[x]=1;dep[x]=d;jp[x][0]=f;for (i=0;jp[x][i];i++)jp[x][i+1]=jp[jp[x][i]][i];root[x]=&sn[++cnt];*root[x]=*root[f];rebuild(*root[x],0,n-1,v[x]);for (i=0;i<G[x].size();i++)if (!vis[G[x][i]]) dfs(G[x][i],x,d+1); }int search(SN&a,SN&b,SN&c,SN&d,int l,int r,int k) {if (l==r) return l;int val=(*a.son[0]).val+(*b.son[0]).val-(*c.son[0]).val-(*d.son[0]).val;int m=(l+r)>>1,s;if (val>=k) s=0,r=m;else s=1,k-=val,l=m+1;return search(*a.son[s],*b.son[s],*c.son[s],*d.son[s],l,r,k); }int LCA(int u,int v) {int i;if (dep[u]!=dep[v]){if (dep[u]<dep[v]) swap(u,v);for (i=17;i>=0;i--)if (dep[u]-(1<<i)>=dep[v])u=jp[u][i];}if (u==v) return u;for (i=17;i>=0;i--)if (jp[u][i]!=jp[v][i]) {u=jp[u][i];v=jp[v][i];}return jp[u][0]; }void answer() {int i,ans=0,u,v,k,lca;for (i=0;i<m;i++){scanf("%d%d%d",&u,&v,&k);u^=ans;lca=LCA(u,v);ans=rv[p[search(*root[u],*root[v],*root[lca],*root[jp[lca][0]],0,n-1,k)]];printf("%d",ans);if (i<m-1) printf("\n");} }int main() {putin();dfs(1,0,1);answer(); } View Code

?

G M T
檢測語言阿爾巴尼亞語阿拉伯語阿塞拜疆語愛爾蘭語愛沙尼亞語巴斯克語白俄羅斯語保加利亞語冰島語波蘭語波斯尼亞語波斯語布爾語(南非荷蘭語)丹麥語德語俄語法語菲律賓語芬蘭語高棉語格魯吉亞語古吉拉特語哈薩克語海地克里奧爾語韓語豪薩語荷蘭語加利西亞語加泰羅尼亞語捷克語卡納達語克羅地亞語拉丁語拉脫維亞語老撾語立陶宛語羅馬尼亞語馬爾加什語馬耳他語馬拉地語馬拉雅拉姆語馬來語馬其頓語毛利語蒙古語孟加拉語緬甸語苗語南非祖魯語尼泊爾語挪威語旁遮普語葡萄牙語齊切瓦語日語瑞典語塞爾維亞語塞索托語僧伽羅語世界語斯洛伐克語斯洛文尼亞語斯瓦希里語宿務語索馬里語塔吉克語泰盧固語泰米爾語泰語土耳其語威爾士語烏爾都語烏克蘭語烏茲別克語希伯來語希臘語西班牙語匈牙利語亞美尼亞語伊博語意大利語意第緒語印地語印尼巽他語印尼語印尼爪哇語英語約魯巴語越南語中文簡體中文繁體?阿爾巴尼亞語阿拉伯語阿塞拜疆語愛爾蘭語愛沙尼亞語巴斯克語白俄羅斯語保加利亞語冰島語波蘭語波斯尼亞語波斯語布爾語(南非荷蘭語)丹麥語德語俄語法語菲律賓語芬蘭語高棉語格魯吉亞語古吉拉特語哈薩克語海地克里奧爾語韓語豪薩語荷蘭語加利西亞語加泰羅尼亞語捷克語卡納達語克羅地亞語拉丁語拉脫維亞語老撾語立陶宛語羅馬尼亞語馬爾加什語馬耳他語馬拉地語馬拉雅拉姆語馬來語馬其頓語毛利語蒙古語孟加拉語緬甸語苗語南非祖魯語尼泊爾語挪威語旁遮普語葡萄牙語齊切瓦語日語瑞典語塞爾維亞語塞索托語僧伽羅語世界語斯洛伐克語斯洛文尼亞語斯瓦希里語宿務語索馬里語塔吉克語泰盧固語泰米爾語泰語土耳其語威爾士語烏爾都語烏克蘭語烏茲別克語希伯來語希臘語西班牙語匈牙利語亞美尼亞語伊博語意大利語意第緒語印地語印尼巽他語印尼語印尼爪哇語英語約魯巴語越南語中文簡體中文繁體???????
語言功能限100個字符 選項 : 歷史 : 幫助 : 反饋關閉

轉載于:https://www.cnblogs.com/KaNNeXFF/p/5441265.html

總結

以上是生活随笔為你收集整理的[BZOJ 2588]Count on a tree的全部內容,希望文章能夠幫你解決所遇到的問題。

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