树状数组的建树 单点修改 单点查询 区间修改 区间查询
Posted andromeda-galaxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的建树 单点修改 单点查询 区间修改 区间查询相关的知识,希望对你有一定的参考价值。
单点修改 单点查询 用普通数组就能写出来
单点修改 区间查询 用线段树 树状数组;
区间修改 区间查询 用线段树 树状数组;
区间修改 单点查询 用线段树 树状数组;
建树
#include<bits/stdc++.h> using namespace std; const int maxn=1e5; struct node { int l,r,w; }tree[4*maxn+1]; void build(int l,int r,int k) { tree[k].l=l; tree[k].r=r; if(l==r) { cin>>tree[k].w; return ; } int mid=(l+r)/2; build(l,mid,2*k); build(mid+1,r,2*k+1); tree[k].w=tree[2*k].w+tree[2*k+1].w; } int main() { build(1,8,1); }
单点查询
#include<bits/stdc++.h> using namespace std; const int maxn=1e5; struct node { int l,r,w; }tree[4*maxn+1]; void build(int l,int r,int k) { tree[k].l=l; tree[k].r=r; if(l==r) { cin>>tree[k].w; cout<<l<<"--"<<tree[k].w<<endl; return ; } int mid=(l+r)/2; build(l,mid,2*k); build(mid+1,r,2*k+1); tree[k].w=tree[2*k].w+tree[2*k+1].w; } int ask(int x,int k)// dian dian cha xun; { if(tree[k].l==tree[k].r) {return tree[k].w; } int mid=(tree[k].l+tree[k].r)/2; if(x<=mid) return ask(x,2*k); else return ask(x,2*k+1); } int main() { build(1,8,1); //for(int i=1;i<=8;i++) cout<<"=="<<ask(i)<<endl; cout<<ask(1,1)<<endl; cout<<ask(7,1)<<endl; }
以上是关于树状数组的建树 单点修改 单点查询 区间修改 区间查询的主要内容,如果未能解决你的问题,请参考以下文章