码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-09-27 20:40:56      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:return   open   lse   opened   using   std   oid   const   树状   

单点修改  单点查询   用普通数组就能写出来  

单点修改  区间查询   用线段树  树状数组;

区间修改  区间查询   用线段树  树状数组;

区间修改  单点查询   用线段树  树状数组;

 

建树  

技术分享图片
#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;
}
单点查询

 

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

标签:return   open   lse   opened   using   std   oid   const   树状   

原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/9715315.html

(2)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!