• 线段树


    数组:
    1
    #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std; 7 const int N=1001; 8 9 int a[N]; 10 int sum[N]; 11 12 void rushu(int jd) 13 { 14 sum[jd]=sum[jd<<1]+sum[jd<<1+1]; 15 } 16 17 void built(int l,int r,int jd) 18 { 19 if(l==r) 20 { 21 sum[jd]=a[l]; 22 return ; 23 } 24 int mid=(l+r)>>1; 25 built(1,mid,jd<<1); 26 built(mid+1,r,jd<<2); 27 rushu(jd); 28 } 29 30 void gai(int l,int r,int jd,int q,int v) 31 { 32 if(l==r) 33 { 34 sum[jd]=v; 35 return ; 36 } 37 int mid=(l+r)>>1; 38 if(q<mid)gai(l,mid,jd<<1,q,v); 39 if(q>mid)gai(mid+1,r,jd<<1+1,q,v); 40 rushu(jd); 41 } 42 43 int js(int l,int r,int jd,int nl,int nr) 44 { 45 if(nl<l&&nr<r) 46 { 47 return sum[jd]; 48 } 49 int mid=(l+r)>>1; 50 int ans=0; 51 if(mid>nl)ans+=js(l,mid,jd*2,nl,nr); 52 if(mid<nr)ans+=js(mid+1,r,jd*2+1,nl,nr); 53 return ans; 54 } 55 56 void built(int l,int r,int jd) 57 { 58 if(l==r) 59 { 60 sum[jd]=a[l]; 61 return ; 62 } 63 int mid=(l+r)>>1; 64 built(l,mid,jd<<1); 65 built(mid+1,r,jd<<1+1); 66 rushu(jd); 67 } 68 69 70 71 int main() 72 { 73 int n,m;//built ,js ,gai ,ts 74 cin>>n>>m; 75 for(int i=1;i<=n;i++) 76 { 77 cin>>a[i]; 78 } 79 80 built(1,n,1); 81 82 int _,__; 83 cin>>_>>__; 84 85 gai(1,n,1,_,__); 86 87 int ___,____; 88 cin>>___>>____; 89 js(1,n,1,___,____); 90 91 return 0; 92 }

     结构体:

     1 #include<iostream>
     2 #include<cstdio>
     3 
     4 using namespace std;
     5 const int N=100001;
     6 
     7 int ans,n,m,x,y,z;
     8 
     9 struct node{
    10     int l,r,w;
    11 }T[N];
    12 
    13 inline void build(int l,int r,int jd)
    14 {
    15     T[jd].l=l;
    16     T[jd].r=r;
    17     if(l==r)
    18     {
    19         cin>>T[jd].w;
    20         return ;
    21     }
    22     int mid=(l+r)>>1;
    23     build(l,mid,jd<<1);
    24     build(mid+1,r,jd<<1|1);
    25     T[jd].w=T[jd<<1].w+T[jd<<1|1].w;
    26 }
    27 
    28 inline void add(int jd)
    29 {
    30     if(T[jd].l==T[jd].r)
    31     {
    32         T[jd].w+=z;
    33         return ;
    34     }
    35     int mid=(T[jd].l+T[jd].r)/2;
    36     if(y<=mid)
    37     {
    38         add(jd<<1);
    39     }
    40     else
    41     {
    42         add(jd<<1|1);
    43     }
    44     T[jd].w=T[jd<<1].w+T[jd<<1|1].w;
    45 }
    46 
    47 inline void sum(int jd)
    48 {
    49     if(y<=T[jd].l&&T[jd].r<=z)
    50     {
    51         ans+=T[jd].w;
    52         return ;
    53     }
    54     int mid=(T[jd].l+T[jd].r)/2;
    55     if(y<=mid)
    56     {
    57         sum(jd*2);
    58     }
    59     if(z>mid)
    60     {
    61         sum(jd*2+1);
    62     }
    63 }
    64 
    65 int main()
    66 {
    67     cin>>n;
    68     build(1,n,1);
    69     cin>>m;
    70     for(int i=1;i<=m;i++)
    71     {
    72         cin>>x>>y>>z;
    73         ans=0;
    74         if(x==1)
    75         {
    76             add(1);
    77         }
    78         else
    79         {
    80             sum(1);
    81             cout<<ans<<endl;
    82         }
    83     }
    84 }
  • 相关阅读:
    上传文件
    Spring Boot Actuator构建RESTful We服务
    sql查询是否存在优化,不要再用count(*)了 AGREATE
    TCP/IP协议
    STM32F405移植ucosii一直进入HardFault_Handler死在这里
    STM32官方固件库
    C语言中如何给整数指定位数补0展示
    mysql511优化
    mysql510_3大范试
    mysql511索引和执行计划
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6822425.html
Copyright © 2020-2023  润新知