树状数组的建树 单点修改 单点查询 区间修改 区间查询

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;
}
单点查询

 

以上是关于树状数组的建树 单点修改 单点查询 区间修改 区间查询的主要内容,如果未能解决你的问题,请参考以下文章

线段树 建树 单点修改 点点/区间查询

专题训练8总结

树状数组的区间修改与单点查询与区间查询

P3374 模板树状数组 1(单点修改区间查询)(树状数组)

单点修改区间查询(树状数组)

树状数组 :单点修改,区间查询