zoukankan      html  css  js  c++  java
  • 线段树

    数组:
    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 }
  • 相关阅读:
    jvm内存配置参数
    6 个设计原则分别是什么?每种设计原则体现的设计模式是哪个?
    classloader 结构,是否可以自己定义一个 java.lang.String 类,为什么? 双亲代理机制。
    求sum=1+111+1111+........+1....111 .
    交换排序
    字符串压缩 stringZip
    TCP为何采用三次握手来建立连接,若采用二次握手可以吗
    使用jsoup抓取新闻信息
    通过地址获得经纬度(百度Geocoding API)
    FileReader
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6822425.html
Copyright © 2011-2022 走看看