树状数组_一维

// 模板水题 敌兵布阵 HDU - 1166
class TreeArray{
public:
    const static int cmaxn = 1e5;  /// Todo:  修改区间的最大值
    int cdate[cmaxn];
    int max_sz;  // 表示元素的个数 在init初始化

    void init(int size) {
        memset(cdate, 0, sizeof(cdate));
        max_sz = size; // 初始化本次样例的元素的个数
    }

    void init(int size, int array[], int len) {
        memcpy(cdate, array, sizeof(int)*len);
        max_sz = size;
    }

    inline int lowbit(int idx) { return idx & -idx; }
    void update(int idx, int val) {
        for (; idx<=max_sz; idx+=lowbit(idx))
            cdate[idx] += val;
    }

    int getsum(int idx) {
        int res = 0;
        for (; idx>0; idx-=lowbit(idx))
            res += cdate[idx];
        return res;
    }

    int getsum(int left, int right) {
        return getsum(right) - getsum(left-1);
    }
};

原文地址:https://www.cnblogs.com/cgjh/p/9347549.html

时间: 2024-10-05 05:46:10

树状数组_一维的相关文章

资瓷区间修改+区间求和的树状数组(一维/二维)

一维:令 \(v_i\) 为差分数组,那么 \([0, k]\) 的前缀和就是 \(\sum{v_i(k+1-i)} = (k+1) \cdot \sum{v_i} + \sum{v_i \cdot (-i)}\),树状数组维护一下 \(v_i\) 和 \(v_i \cdot i\) 即可. template <typename I> struct Fenwick { struct Node { I v0, v1; void add(I d0, I d1) { v0 += d0; v1 +=

树状数组_二分_POJ-2182

题目链接:http://poj.org/problem?id=2182 这题似乎可以有多解,但题目里似乎没有specialjudge 本题解法较为简单,注意到每次可以确定队尾的元素,在剩下的未确定的元素中排第几. 至于值为多少就可以用二分和树状数组来解决. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std

USACO5.3 IDDFS_强连通_二维树状数组_斐蜀定理_矩形切割

启发式搜索 启发式搜索的主要思想是通过评价一个状态有"多好"来改进对于解的搜索. 方法#1:启发式剪枝 估价函数最简单最普通的用法是进行剪枝.假设有一个求最小代价的一个搜索,使用一个可行的估价函数.如果搜到当前状态时代价为A,这个状态的估价函数是B,那么从这个状态开始搜所能得到的最小代价是A+B.如果当前最优解是C满足C 方法#2:最佳优先搜索 最佳搜索可以看成贪心的深度优先搜索. 与一般搜索随意扩展后继节点不同,最优优先搜索按照估价函数所给的他们的"好坏"的顺序扩

[bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演

数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$. 想法:我们先不考虑那个a的限制:我们设f(i)表示整除i的自然数之和. $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(gcd(i,j))$ $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(d)\cdot [gcd(i,j)

树状数组_二维

class TreeArraryTwo{ public : const static int cmaxn = 1e3+200; int date[cmaxn][cmaxn]; int xsz, ysz; void init(int size_x, int size_y) { xsz = size_x; ysz = size_y; memset(date, 0, sizeof(date)); } inline int lowbit(int idx) { return idx & -idx; } v

poj_1190 树状数组

题目大意 给定一个S*S的矩形,该矩形由S*S个1x1的单元格构成,每个单元格内可以放一个整数,每次有如下可能操作: (1)改变某个单位单元格中的数的大小 (2)查询由若干个连续单元格构成的X*Y的大小的矩形内所有数的总和 题目分析 典型的区间操作,而且是单点更新,区间查询.因此使用树状数组,不过应该使用二维树状数组.二维树状数组和一维其实没什么区别....     另:用线段树也做了一份,但是超时,果然树状数组在效率上还是略胜线段树的.下面给出树状数组的AC代码和线段树的TLE代码. 实现(c

树状数组入门

用office做了一张pdf - - 这是一维的情形,如果是二维,可以把每一行的一维树状数组看成一个节点,然后再把二维树状数组看成一维树状数组. 好文章:https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/#prob 两道入门题:http://acm.hdu.edu.cn/showproblem.php?pid=1556 http://poj.org/problem

[扫描线+树状数组]解决矩形包含点的问题

今天做到第二题,大部分的思路都理解了之后最后剩下一个问题 zzx:“然后扫描线+树状数组搞一下就好了” 看到这两个算法就产生了一种我肯定会的错觉... 然后后来发现并不会的时候很惭愧... 然后十分感谢YDC,在之前完全陌生的情况下 我去问这样一个问题 超级超级超级耐心地给我解答  我问着每一个他们看起来显然的具体处理方法 突然发现真的像张老师说的:“你普及升提高的这条路没有怎么走,中间那块知识是空着的啊” 今天才切实体会到...但是或许正是这样今天学到这样的一个东西更让我觉得开心吧 树状数组解

【BZOJ】1452: [JSOI2009]Count 树状数组

Description Input Output Sample Input Sample Output 1 2 HINT 题解: 二维的树状数组啊+一维的颜色状态,然后直接做就好……实际上比照一维的树状数组就是多了一个for循环,然后查询操作的时候就相当于查询某一矩阵的大小,树状数组起到一个类似前缀和的作用.   1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <