AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

树状数组与线段树模板

作者: 作者的头像   蓝桥杯冲ya ,  2023-03-18 14:41:46 ,  所有人可见 ,  阅读 51


1


2
//改变序列参数,动态查询一段序列和:树状数组、线段树
//动态查询一段序列最大值或最小值:线段树

//树状数组
int lowbit(int x)
{
    return x & -x;
}

void add(int x, int v)
{
    for(int i = x; i <= n; i += lowbit(i)) tr[i] += v;
}

int sum(int x)
{
    int res = 0;
    for(int i = x; i > 0; i -= lowbit(i)) res += tr[i];
    return res;
}

//线性数组有四个模板函数 pushup、build、query、modify
struct tr
{
    int l, r;
    int sum;
}tr[N * 4];

int w[N], n, m;

void pushup(int u)
{
    tr[u].sum = tr[2 *u].sum +tr[2 * u + 1].sum; 
}

void build(int u, int l, int r)
{
    if(l == r) tr[u] = {l, r, w[r]};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(2 * u, l, mid), build(2 * u + 1, mid + 1, r);
        pushup(u);
    }
}

void modify(int u, int x, int v)
{
    if(tr[u].l == tr[u].r) tr[u].sum += v;
    else
    {
        int mid = tr[u].l +tr[u].r >> 1;
        if(x <= mid) modify(2 * u, x, v);
        if(x > mid) modify(2 * u + 1, x, v);
        pushup(u);
    }
}

int query(int u, int l, int r)
{
    if(l <= tr[u].l && r >= tr[u].r) return tr[u].sum;
    int mid = tr[u].l + tr[u].r >> 1;
    int sum = 0;
    if(l <= mid) sum += query(2 * u, l, r);
    if(r > mid) sum += query(2 * u + 1, l, r);
    return sum;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息