标签:结构体 数据 思想 for over center log 递归 方案
POJ2182题解——线段树
2019-12-20
by juruoOIer
1.线段树简介(来源:百度百科)
void build_tree(int l,int r,int k) { tree[k].l=l; tree[k].r=r; tree[k].sum=r-l+1; if(l==r) return ; int m=(l+r)>>1; build_tree(l,m,k<<1); build_tree(m+1,r,(k<<1)|1); }
这里使用结构体来完成二叉树的操作:
struct Tree { int l,r,sum; }tree[4*N];
最后,给出POJ2182的代码,用以讲解线段树:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=8888; int ans[N],b[N]; int n; struct Tree { int l,r,sum; }tree[4*N]; void build_tree(int l,int r,int k) { tree[k].l=l; tree[k].r=r; tree[k].sum=r-l+1; if(l==r) return ; int m=(l+r)>>1; build_tree(l,m,k<<1); build_tree(m+1,r,(k<<1)|1); } void solve(int num,int k,int i) { tree[k].sum--; if(tree[k].l==tree[k].r) { ans[i]=tree[k].l; return ; } if(num<=tree[2*k].sum) solve(num,2*k,i); else solve(num-tree[2*k].sum,2*k+1,i); } int main() { int i,j; scanf("%d",&n); for(i=2;i<=n;i++) scanf("%d",&b[i]); b[1]=0; build_tree(1,n,1); for(i=n;i>=1;i--) solve(b[i]+1,1,i); for(i=1;i<=n;i++) printf("%d\n",ans[i]); }
部分知识来源:百度百科
标签:结构体 数据 思想 for over center log 递归 方案
原文地址:https://www.cnblogs.com/Warframe-Gauss/p/12074833.html