• [模板]二维树状树组 单点修改 区间查询


    输入格式:

    1.输入两个整数n,m,表示矩阵的长和宽;

    2.输入n行m列个整数,为矩阵的每个元素;

    3.输入一个整数T,表示操作次数;

    4.输入T行:

    格式1:1 x y k,表示将坐标为(x,y)的点加上k;

    格式2:2 x1 y1 x2 y2,表示求左上角坐标为(x1,y1),右下角坐标为(x2,y2)的矩阵内所有元素的总和。

    输出格式:

    每个输出1行,输出每次操作2的结果。

    代码如下:

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 #include<ctime>
      5 #include<cstdlib>
      6 //#include<cmath>
      7 
      8 #include<string>
      9 #include<stack>
     10 #include<queue>
     11 #include<vector>
     12 #include<algorithm>
     13 #include<map>
     14 
     15 using namespace std;
     16 
     17 void read(int &x){
     18     x=0;
     19     char t=getchar();
     20     bool f=0;
     21     
     22     while(t<'0' || t>'9'){
     23         if(t=='-')f=1;
     24         t=getchar();
     25     }
     26     
     27     while(t>='0' && t<='9'){
     28         x=(x<<3)+(x<<1)+t-'0';
     29         t=getchar();
     30     }
     31     
     32     if(f)x=-x;
     33 }
     34 
     35 void add(int,int,int);
     36 int query(int,int);
     37 
     38 int a[1010][1010];
     39 int c[1010][1010];
     40 
     41 int n,m,i,j;
     42 
     43 int T,f,x,y,k;
     44 
     45 int x1,y1,x2,y2;
     46 
     47 int main(){
     48     read(n);
     49     read(m);
     50     
     51     for(i=1;i<=n;i++)
     52         for(j=1;j<=m;j++){
     53             read(a[i][j]);
     54             add(i,j,a[i][j]);
     55         }
     56     
     57     read(T);
     58     
     59     while(T--){
     60         read(f);
     61         
     62         if(f==1){
     63             read(x);read(y);read(k);
     64             add(x,y,k);
     65         }
     66         
     67         if(f==2){
     68             read(x1);read(y1);read(x2);read(y2);
     69             printf("%d
    ",query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1));
     70         }
     71     }
     72     
     73     return 0;
     74 }
     75 
     76 void add(int a,int b,int x){
     77     int i=a,j;
     78     
     79     while(i<=n){
     80         j=b;
     81         
     82         while(j<=m){
     83             c[i][j]+=x;
     84             j+=j&-j;
     85         }
     86         
     87         i+=i&-i;
     88     }
     89 }
     90 
     91 int query(int a,int b){
     92     int ans=0,i=a,j;
     93     
     94     while(i>=1){
     95         j=b;
     96         
     97         while(j>=1){
     98             ans+=c[i][j];
     99             j-=j&-j;
    100         }
    101         
    102         i-=i&-i;
    103     }
    104     
    105     return ans;
    106 }
  • 相关阅读:
    数组
    mysql优化思路
    mysql_存储过程
    mysql_函数
    mysql_结构
    mysql_触发器
    mysql_变量
    mysql_事务
    mysql总结
    mysql备份
  • 原文地址:https://www.cnblogs.com/running-coder-wfh/p/7201805.html
Copyright © 2020-2023  润新知