[BZOJ 2588]Count on a tree
生活随笔
收集整理的這篇文章主要介紹了
[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| 檢測語言阿爾巴尼亞語阿拉伯語阿塞拜疆語愛爾蘭語愛沙尼亞語巴斯克語白俄羅斯語保加利亞語冰島語波蘭語波斯尼亞語波斯語布爾語(南非荷蘭語)丹麥語德語俄語法語菲律賓語芬蘭語高棉語格魯吉亞語古吉拉特語哈薩克語海地克里奧爾語韓語豪薩語荷蘭語加利西亞語加泰羅尼亞語捷克語卡納達語克羅地亞語拉丁語拉脫維亞語老撾語立陶宛語羅馬尼亞語馬爾加什語馬耳他語馬拉地語馬拉雅拉姆語馬來語馬其頓語毛利語蒙古語孟加拉語緬甸語苗語南非祖魯語尼泊爾語挪威語旁遮普語葡萄牙語齊切瓦語日語瑞典語塞爾維亞語塞索托語僧伽羅語世界語斯洛伐克語斯洛文尼亞語斯瓦希里語宿務語索馬里語塔吉克語泰盧固語泰米爾語泰語土耳其語威爾士語烏爾都語烏克蘭語烏茲別克語希伯來語希臘語西班牙語匈牙利語亞美尼亞語伊博語意大利語意第緒語印地語印尼巽他語印尼語印尼爪哇語英語約魯巴語越南語中文簡體中文繁體 | ? | 阿爾巴尼亞語阿拉伯語阿塞拜疆語愛爾蘭語愛沙尼亞語巴斯克語白俄羅斯語保加利亞語冰島語波蘭語波斯尼亞語波斯語布爾語(南非荷蘭語)丹麥語德語俄語法語菲律賓語芬蘭語高棉語格魯吉亞語古吉拉特語哈薩克語海地克里奧爾語韓語豪薩語荷蘭語加利西亞語加泰羅尼亞語捷克語卡納達語克羅地亞語拉丁語拉脫維亞語老撾語立陶宛語羅馬尼亞語馬爾加什語馬耳他語馬拉地語馬拉雅拉姆語馬來語馬其頓語毛利語蒙古語孟加拉語緬甸語苗語南非祖魯語尼泊爾語挪威語旁遮普語葡萄牙語齊切瓦語日語瑞典語塞爾維亞語塞索托語僧伽羅語世界語斯洛伐克語斯洛文尼亞語斯瓦希里語宿務語索馬里語塔吉克語泰盧固語泰米爾語泰語土耳其語威爾士語烏爾都語烏克蘭語烏茲別克語希伯來語希臘語西班牙語匈牙利語亞美尼亞語伊博語意大利語意第緒語印地語印尼巽他語印尼語印尼爪哇語英語約魯巴語越南語中文簡體中文繁體 | ? | ? | ? | ? | ? | ? | ? |
轉載于:https://www.cnblogs.com/KaNNeXFF/p/5441265.html
總結
以上是生活随笔為你收集整理的[BZOJ 2588]Count on a tree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XeLaTeX插入GB/T 7714-2
- 下一篇: SQL Server 自定义快捷键