二维树状数组的区间加减及查询 tyvj 1716 上帝造题的七分钟

news/2024/7/3 7:40:12

详细解释见小结。http://blog.csdn.net/zmx354/article/details/31740985

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>

#pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 9999991
#define lowbit(x) (x&(-x))

using namespace std;

const int N = 2049;

int a[N][N];
int ax[N][N];
int ay[N][N];
int axy[N][N];

void Updata(int a[N][N],int x,int y,int n,int m,int data)
{
    for(; x <= n; x += lowbit(x))
    {
        for(int t = y; t <= m; t += lowbit(t))
        {
            a[x][t] += data;
        }
    }
}

int Query(int a[N][N],int x,int y)
{
    int sum = 0;

    while(x > 0)
    {
        for(int t = y; t > 0; t -= lowbit(t))
        {
            sum += a[x][t];
        }
        x -= lowbit(x);
    }

    return sum;
}

int sum(int x,int y)
{
    return Query(a,x,y)*(x+1)*(y+1) - (y+1)*Query(ax,x,y) - (x+1)*Query(ay,x,y) + Query(axy,x,y);
}

void Add(int x1,int y1,int x2,int y2,int n,int m,int data)
{
    Updata(a,x1,y1,n,m,data);
    Updata(a,x2+1,y1,n,m,-data);
    Updata(a,x1,y2+1,n,m,-data);
    Updata(a,x2+1,y2+1,n,m,data);

    Updata(ax,x1,y1,n,m,x1*data);
    Updata(ax,x2+1,y1,n,m,-(x2+1)*data);
    Updata(ax,x1,y2+1,n,m,-x1*data);
    Updata(ax,x2+1,y2+1,n,m,(x2+1)*data);

    Updata(ay,x1,y1,n,m,y1*data);
    Updata(ay,x2+1,y1,n,m,-y1*data);
    Updata(ay,x1,y2+1,n,m,-(y2+1)*data);
    Updata(ay,x2+1,y2+1,n,m,(y2+1)*data);

    Updata(axy,x1,y1,n,m,x1*y1*data);
    Updata(axy,x2+1,y1,n,m,-(x2+1)*y1*data);
    Updata(axy,x1,y2+1,n,m,-x1*(y2+1)*data);
    Updata(axy,x2+1,y2+1,n,m,(x2+1)*(y2+1)*data);
}

int main()
{
    int n,m;

    char order[10];

    int x1,x2,y1,y2,data;

    memset(a,0,sizeof(a));
    memset(ax,0,sizeof(ax));
    memset(ay,0,sizeof(ay));
    memset(axy,0,sizeof(axy));

    while(scanf("%s",order) != EOF)
    {
        if(order[0] == 'L')
        {
            scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&data);

            Add(x1,y1,x2,y2,n,m,data);
        }
        else if(order[0] == 'k')
        {
            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);

            printf("%d\n",sum(x2,y2) - sum(x1-1,y2) - sum(x2,y1-1) + sum(x1-1,y1-1));
        }
        else
        {
            scanf("%d %d",&n,&m);
        }
    }

    return 0;
}



http://www.niftyadmin.cn/n/1382695.html

相关文章

git常用命令与概念汇总

设置记住用户名和密码 # --global如果不加则只针对当前项目 # 设置之后需要重新pull一下代码&#xff0c;然后提示输入用户名密码后会自动保存&#xff0c;从而实现记住用户名和密码的目的。 # 这样设置的用户名和密码是以明文的方式存储的。比如你安装了一个Npm包&#xff0c…

CentOS6 Shell脚本/bin/bash^M: bad interpreter错误解决方法

为什么80%的码农都做不了架构师&#xff1f;>>> 在windows下保存了一个脚本文件&#xff0c;用ssh上传到centos&#xff0c;添加权限执行nginx提示没有那个文件或目录。shell脚本放到/etc/init.d/目录下&#xff0c;再执行/etc/init.d/nginx&#xff0c;提示多了这…

[并查集] hihocoder 1158 质数相关

题目大意 题目链接&#xff0c;定义两个数\(a,b\)质数相关满足 \(ba\times p\), 且\(p\)是质数。给定数组&#xff0c;问最大质数无关子集大小。 算法思路 首先想到的是将每个数看作一个顶点&#xff0c;质数相关的两个数之间连边&#xff0c;求最大独立子集。但是最大独立子集…

Spring Cloud 微服务的那点事

在详细的了解SpringCloud中所使用的各个组件之前&#xff0c;我们先了解下微服务框架的前世今生。 单体架构 在网站开发的前期&#xff0c;项目面临的流量相对较少&#xff0c;单一应用可以实现我们所需要的功能&#xff0c;从而减少开发、部署和维护的难度。这种用于简单的增删…

Swift - 类扩展(extension)

&#xff08;本文代码已升级至swift3&#xff09;Swift语言的类扩展是一个强大的工具&#xff0c;我们可以通过类扩展完成如下事情&#xff1a; 1&#xff0c;给已有的类添加计算属性和计算静态属性2&#xff0c;定义新的实例方法和类方法3&#xff0c;提供新的构造器4&#xf…

[vue-router] uncaught error during route navigation

vue路由在加载组件之前会执行一些逻辑&#xff0c;尤其是生命周期的钩子函数 如果你在以上的钩子函数中&#xff0c;写了自己的逻辑&#xff0c;并报错了。就会触发[vue-router] uncaught error during route navigation这个错误。 原因是vue进行了try catch&#xff0c;会捕…

dajango 模板中 js 使用服务器返回的数据

var data "{{ line|safe }}"明确告诉django不要逃避该变量的输出Django的模板中会对HTML标签和JS等语法标签进行自动转义&#xff0c;原因显而易见&#xff0c;这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义&#xff0c;比如我们做一个内容管理系统…

Reddit重写其iOS应用,改进性能、模块化和测试

去年&#xff0c;Reddit一直在努力改进其iOS应用的性能&#xff0c;同时使其适合更快的迭代周期&#xff0c;改善其测试覆盖率&#xff0c;提高其可扩展性。所有这些都是通过把应用原来的MVC架构改造成Model-View-Presenter&#xff08;MVP&#xff09;架构实现的。\\原来的MVC…