bzoj3132

二维树状数组

树状数组什么的只支持修改单个数值,但是这道题要我们更新一个区域

盗图

就是这样,然后维护四个bit就行了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2049;
int n, m;
char s[10];
struct bit {
    int tree[N][N];
    int lowbit(int i)
    {
        return i & -i;
    }
    void update(int x, int y, ll delta)
    {
        for(int i = x; i <= n; i += lowbit(i))
            for(int j = y; j <= m; j += lowbit(j))
                tree[i][j] += delta;
    }
    int query(int x, int y)
    {
        ll ret = 0;
        for(int i = x; i; i -= lowbit(i))
            for(int j = y; j; j -= lowbit(j))
                ret += tree[i][j];
        return ret;
    }
} A, B, C, D;
void add(int a, int b, int c, int d, int delta)
{
    A.update(c + 1, d + 1, delta);
    A.update(a, b, delta);
    A.update(a, d + 1, -delta);
    A.update(c + 1, b, -delta);
    B.update(c + 1, d + 1, (c + 1) * delta);
    B.update(a, b, a * delta);
    B.update(a, d + 1, -a * delta);
    B.update(c + 1, b, -(c + 1) * delta);
    C.update(c + 1, d + 1, (d + 1) * delta);
    C.update(a, b, b * delta);
    C.update(a, d + 1, -(d + 1) * delta);
    C.update(c + 1, b, -b * delta);
    D.update(c + 1, d + 1, (c + 1) * (d + 1) * delta);
    D.update(a, b, a * b * delta);
    D.update(a, d + 1, -a * (d + 1) * delta);
    D.update(c + 1, b, -(c + 1) * b * delta);
}
int getans(int a, int b)
{
    return (a + 1) * (b + 1) * A.query(a, b) - (a + 1) * C.query(a, b) - (b + 1) * B.query(a, b) + D.query(a, b);
}
int getans(int a, int b, int c, int d)
{
    return getans(c, d) - getans(a - 1, d) - getans(c, b - 1) + getans(a - 1, b - 1);
}
int main()
{
    scanf(" X %d %d", &n, &m);
    while(scanf("%s", s) != EOF)
    {
        int a, b, c, d, delta;
        if(s[0] == ‘L‘)
        {
            scanf("%d%d%d%d%d", &a, &b, &c, &d, &delta);
            add(a, b, c, d, delta);
        }
        if(s[0] == ‘k‘)
        {
            scanf("%d%d%d%d", &a, &b, &c, &d);
            printf("%d\n", getans(a, b, c, d));
        }
    }
    return 0;
}

时间: 2024-08-03 05:52:52

bzoj3132的相关文章

【BZOJ3132】上帝造题的七分钟 树状数组

[BZOJ3132]上帝造题的七分钟 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. 第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作. 第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围. 第五分钟,和雪说,要有耐心,于是便有了时间限制. 第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中

bzoj3132 上帝造题的七分钟(差分+二维树状数组)

bzoj3132 上帝造题的七分钟(差分+二维树状数组) Time Limit: 20 Sec Memory Limit: 128 MB Description "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. 第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作. 第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围. 第五分

【树状数组二维区间加+区间查询模板】bzoj3132

新知识,其实和之前讲过的一维差不多,只要维护四个数组就行了,不过还是参考了别人的代码,还是要好好练练才行 #include<iostream> #include<cstdio> #include<cstring> #define maxn 2050 using namespace std; int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn],d[maxn][maxn]; int n,m; int lowbit(int x){ret

BZOJ3132 上帝造题的七分钟

矩阵修改矩阵求和的裸题 参考 wyl8899<树状数组维护区间和的模型及其拓广的简单总结>一文. 树状数组在进行区间操作的时候维护一个查分数组 d . d[i] = a[i] - a[i - 1]. 这样单点询问就是 ∑i = 1 … x d[i] 区间询问的时候, 询问 1 … x 的区间即要求 ∑i = 1 … x (d[i] * (x - i + 1)), 即 (x + 1) * ∑(d[i]) - ∑ (d[i] * i). 所以说只要多维护一个 d[i] * i 的树状数组就可以了.

【树状数组】BZOJ3132 上帝造题的七分钟

3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1004  Solved: 445[Submit][Status][Discuss] Description "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. 第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作.

【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作,每次为一下三种之一: RELEASE x:对x执行一次感染: RECENTER x:把根节点改为x,并对原来的根节点执行一次感染: REQUEST x:询问x子树中所有节点感染代价的平均值. 输入 输入的第一行包含两个整数n和m,分别代表局域网中计算机的数量,以及操作和询问的总数.接下来n-1行,

【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改

题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i个元素的值.接下来q行,每行包含两个整数l和r,代表一次询问. 输出 对于每次询问,输出一行,代表询问的答案. 样例输入 5 5 5 2 4 1 3 1 5 1 3 2 4 3 5 2 5 样例输出 28 17 11 11 17 题解 单调栈+离线+扫描线+树状数组区间修改 首先把使用单调栈找出每个

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz

【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. 输入 第一行N,M接下来M行,每行形如1 a b c或2 a b c 输出 输出每个询问的结果 样例输入 2 5 1 1 2 1 1 1 2 2 2 1 1 2 2 1 1 1 2 1 2 3 样例输出 1 2 1 题解 整体二分+树状数组区间修改 当年naive的树套树题解 前两天由于要