zoukankan      html  css  js  c++  java
  • HihoCoder

    You are given an N × N matrix. At the beginning every element is 0. Write a program supporting 2 operations:

     1. Add x y value: Add value to the element Axy. (Subscripts starts from 0

    2. Sum x1 y1 x2 y2: Return the sum of every element Axy for x1xx2, y1yy2.

    Input

    The first line contains 2 integers N and M, the size of the matrix and the number of operations.

    Each of the following M line contains an operation.

    1 ≤ N ≤ 1000, 1 ≤ M ≤ 100000

    For each Add operation: 0 ≤ x < N, 0 ≤ y < N, -1000000 ≤ value ≤ 1000000

    For each Sum operation: 0 ≤ x1x2 < N, 0 ≤ y1y2 < N

    Output

    For each Sum operation output a non-negative number denoting the sum modulo 109+7.

    Sample Input

    5 8
    Add 0 0 1
    Sum 0 0 1 1
    Add 1 1 1
    Sum 0 0 1 1
    Add 2 2 1
    Add 3 3 1
    Add 4 4 -1
    Sum 0 0 4 4 

    Sample Output

    1
    2
    3 
    题目大意:给你一个N*N二维矩阵,初始值时都为0,有两种操作
    1:单点修改值
    2:给出一个子矩阵的左上和右下角的坐标,询问一个子矩形范围内的值的和.
    二维树状数组模板题,单点更新区间查询
    #include<queue>
    #include<set>
    #include<cstdio>
    #include <iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define max_v 1005
    #define mod 1000000007
    typedef long long LL;
    int c[max_v][max_v];
    int lowbit(int x)
    {
        return x&(-x);
    }
    LL getsum(int x,int y)
    {
        LL sum=0;
        for(int i=x;i!=0;i-=lowbit(i))
        {
            for(int j=y;j!=0;j-=lowbit(j))
            {
                sum=(sum+c[i][j]);
            }
        }
        return sum;
    }
    void update(int x,int y,int v)
    {
        for(int i=x;i<max_v;i+=lowbit(i))
        {
            for(int j=y;j<max_v;j+=lowbit(j))
            {
                c[i][j]=(c[i][j]+v);
            }
        }
    }
    int main()
    {
        char str[10];
        int n,m;
        while(~scanf("%d %d",&n,&m))
        {
            memset(c,0,sizeof(c));
            int a,b,w;
            while(m--)
            {
                scanf("%s",str);
                if(str[0]=='A')
                {
                    scanf("%d %d %d",&a,&b,&w);
                    a++;
                    b++;
                    update(a,b,w);
                }else
                {
                    int sx,sy,ex,ey;
                    scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
                    sx++;
                    sy++;
                    ex++;
                    ey++;
                    printf("%lld
    ",(getsum(ex,ey)-getsum(sx-1,ey)-getsum(ex,sy-1)+getsum(sx-1,sy-1)+mod)%mod);
                }
            }
        }
        return 0;
    }
    /*
    题目大意:给你一个N*N二维矩阵,初始值时都为0,有两种操作
    1:单点修改值 
    2:给出一个子矩阵的左上和右下角的坐标,询问一个子矩形范围内的值的和.
    
    二维树状数组模板题,单点更新区间查询
    
    */
     
    
    
  • 相关阅读:
    JavaScript测试工具chai
    gradle初始仓库依赖(含junit)
    汇编和中断
    oracle-12c-ee安装
    pickle
    Python (zip, lambda, map, shallow copy, deepcopy)
    豆瓣源下载tensorflow
    Linux上XRDP可作为WIN的远程连接
    VNC连接远程Linux——废弃电脑作为运算机器
    MACOS 运行Keras报错
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9472608.html
Copyright © 2011-2022 走看看