【数据结构】线段树入门

感谢博主:https://www.cnblogs.com/jason2003/p/9676729.html板块一:区间查询+单点修改洛谷P3374#include<bits/stdc++.h>#define ll long long#define rep(i,a,n) for(int i=a;i<=n;i++)#define per(i,n,a) for(int i=...
摘要由CSDN通过智能技术生成

感谢博主:https://www.cnblogs.com/jason2003/p/9676729.html

值得一提的是,计算2时一定要改成i<<1这样能解决很多时间,还有要开long long,还有,函数前面要加inline 我在其他OJ交这道题时,就因为没加inline 就被卡了,交了就过了。*

板块一:区间查询+单点修改
洛谷P3374

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define mem(a) memset(a,0,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;

int n,m;
int ans;
int input[500010];

struct node{
   
	int l,r;
	int sum;
}tree[2000010];

inline void build(int i,int l,int r){
   //递归建树
    tree[i].l=l;tree[i].r=r;
    if(l==r){
   
        tree[i].sum=input[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}

inline int search(int i,int l,int r){
   
    if(tree[i].l>=l && tree[i].r<=r)//区间查询
        return tree[i].sum;
    if(tree[i].r<l || tree[i].l>r)  return 0;
    int s=0;
    if(tree[i*2].r>=l)  s+=search(i*2,l,r);
    if(tree[i*2+1].l<=r)  s+=search(i*2+1,l,r);
    return s;
}

inline void add(int i,int dis,int k){
   
    if(tree[i].l==tree[i].r){
   //修改单点
        tree[i].sum+=k;
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值