• 树状数组


    区间更新:

     //CODE CJOJ 1404
    1
    #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define ll long long 5 using namespace std; 6 ll c[100005],c1[100005],d[100005]; //d是贡献值,C是贡献值的树状数组,C1是贡献值乘以I的树状数组 7 ll sum[100005]; 8 int n,q; 9 int lowbit(int x){ 10 return x&(-x); 11 } 12 void add1(int x,ll zhi){ 13 for(int i=x;i<=n;i+=lowbit(i)) 14 c[i]+=zhi; 15 } 16 void add2(int x,ll zhi){ 17 for(int i=x;i<=n;i+=lowbit(i)) 18 c1[i]+=zhi; 19 } 20 ll getsum1(int x){ 21 ll ret=0; 22 for(int i=x;i>0;i-=lowbit(i)) 23 ret+=c[i]; 24 return ret; 25 } 26 ll getsum2(int x){ 27 ll ret=0; 28 for(int i=x;i>0;i-=lowbit(i)) 29 ret+=c1[i]; 30 return ret; 31 } 32 void add(int x,int y,ll w){ 33 d[x]+=w; 34 d[y+1]-=w; 35 add1(x,w);; 36 add1(y+1,-w); 37 add2(x,(ll)x*w); 38 add2(y+1,(ll)-(y+1)*w); 39 } 40 int main(){ 41 freopen("shulieb.in","r",stdin); 42 freopen("shulieb.out","w",stdout); 43 scanf("%d",&n); 44 for(int i=1;i<=n;i++){ 45 register int x; 46 scanf("%d",&x); 47 sum[i]+=sum[i-1]+x; 48 } 49 scanf("%d",&q); 50 for(int i=1;i<=q;i++){ 51 register char a[10]; 52 scanf("%s",a); 53 if(a[0]=='A'){ 54 register int x,y; 55 ll w; 56 scanf("%d%d%lld",&x,&y,&w); 57 add(x,y,w); 58 } else{ 59 register int x; 60 scanf("%d",&x); 61 ll xx=sum[x]+(ll)(x+1)*getsum1(x)-getsum2(x); 62 ll yy=sum[x-1]+(ll)x*getsum1(x-1)-getsum2(x-1); 63 printf("%lld ",(ll)xx-yy); 64 } 65 } 66 }

    二维树状数组:

     1 //CJOJ 1294
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 using namespace std;
     7 int lowbit(int x){
     8     return x&(-x);
     9 }
    10 int n;
    11 int c[1030][1030];
    12 void add(int x,int y,int z){
    13     for(int i=x;i<=n;i+=lowbit(i))
    14     for(int j=y;j<=n;j+=lowbit(j))
    15         c[i][j]+=z;
    16 }
    17 int jisuan(int x,int y){
    18     int tot=0;
    19     for(int i=x;i>0;i-=lowbit(i))
    20     for(int j=y;j>0;j-=lowbit(j))
    21         tot+=c[i][j];
    22     return tot;
    23 }
    24 int main(){
    25     freopen("1.in","r",stdin);
    26     freopen("1.out","w",stdout);
    27     int type;
    28     while(scanf("%d",&type)!=EOF&&type!=3){
    29     //lowbit(0)会死循环!!!需将坐标都转化到(1-N中去)
    30     if(type==0) scanf("%d",&n);
    31     else if(type==1){
    32         register int x,y,a;
    33         scanf("%d%d%d",&x,&y,&a);
    34         x++,y++;
    35         add(x,y,a);
    36     } else if(type==2){
    37         register int x1,x2,y1,y2;
    38         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    39         x1++,x2++,y1++,y2++;
    40         printf("%d
    ",jisuan(x2,y2)-jisuan(x2,y1-1)-jisuan(x1-1,y2)+jisuan(x1-1,y1-1));
    41     }
    42     }
    43 }
  • 相关阅读:
    云server之间实时文件同步和文件备份的最简单高效的免费方案
    小程序 通过栈的方式把,上个返回过的页面数据传到当前页面
    mpvue 实例
    mpvue配合less
    java随笔5 完整路径的应用
    java随笔4 java中接参整形转字符串
    java随笔2 变量类定义
    java随笔1 常用快捷键 补全和补全提示等
    对象(针对对象)
    事务的2种简单实例
  • 原文地址:https://www.cnblogs.com/cjoier-nfy/p/6681609.html
Copyright © 2020-2023  润新知