树状数组三种写法

第一种:点修改 区间求和

hdu1166
http://acm.hdu.edu.cn/showproblem.php?pid=1166
题意:N个营地,1..N,每个营地有一些人
两种操作:
1. 给某个营地加上或减去一些人
2. 询问一个区间的总人数

inline void add(int x, int value){
    for (int i=x; i<=n; i+=lowbit(i)){
        tree[i] += value;
    }
}
inline int get(int x){
    int ret = 0;
    for (int i=x; i; i-=lowbit(i)){
        ret += tree[i];
    }
    return ret;
}

第二种:区间修改,点询问
用类似前缀和的思想统计一个点的变化量,从而将第二种转化问第一种
可以发现,第二种的代码和第一种加减相反

hdu1556
http://acm.hdu.edu.cn/showproblem.php?pid=1556
题意:n个气球,每次给一个区间涂色,问最后每个气球被涂色几次

inline void add(int x, int value){
    for (int i=x; i; i-=lowbit(i)){
        tree[i] += value;
    }
}
inline int get(int x){
    int ret = 0;
    for (int i=x; i<=n; i+=lowbit(i)){
        ret += tree[i];
    }
    return ret;
}

第三种:区间修改,区间询问

可以使用 Vue 3 的响应式系统和遍历算法来实现循环修改树形数据属性名的功能。具体实现方式如下: 1. 定义一个函数 `updateTreeData`,该函数接受两个参数:`treeData` 和 `oldKey`,其中 `treeData` 是一个树形数据数组,`oldKey` 是要修改的属性名。 2. 在函数内部,使用 Vue 3 的 `reactive` 函数将 `treeData` 转换为响应式对象,并使用 `traverseTreeData` 函数遍历树形数据。 3. 在 `traverseTreeData` 函数中,使用 `Object.keys` 函数获取每个节点的属性名,并判断是否与 `oldKey` 相同。如果相同,则使用 `Reflect.defineProperty` 函数修改属性名,并将新属性名添加到节点中。 4. 最后返回修改后的树形数据数组。 示例代码如下: ```javascript import { reactive } from 'vue' function updateTreeData(treeData, oldKey) { const reactiveTreeData = reactive(treeData) function traverseTreeData(data) { if (Array.isArray(data)) { data.forEach(item => traverseTreeData(item)) } else if (typeof data === 'object') { const keys = Object.keys(data) keys.forEach(key => { if (key === oldKey) { const newKey = 'newKey' Reflect.defineProperty(data, newKey, Object.getOwnPropertyDescriptor(data, oldKey)) delete data[oldKey] data[newKey] = true } else { traverseTreeData(data[key]) } }) } } traverseTreeData(reactiveTreeData) return reactiveTreeData } ``` 使用示例: ```javascript const treeData = [ { id: 1, name: 'node1', children: [ { id: 2, name: 'node2', children: [ { id: 3, name: 'node3', isLeaf: true } ] } ] } ] const updatedTreeData = updateTreeData(treeData, 'isLeaf') console.log(updatedTreeData) ``` 输出结果: ```javascript [ { id: 1, name: 'node1', children: [ { id: 2, name: 'node2', children: [ { id: 3, name: 'node3', newKey: true } ] } ] } ] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值