• 线段树


    线段树

    单点修改,区间查询

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn = 50010;
     5 typedef long long ll;
     6 int cnt[maxn<<2];
     7 
     8 void Pushup(int pt){
     9     cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1];
    10 }
    11 
    12 //建树Build(1,n,1)
    13 void Build(int l,int r, int pt){
    14     if(l==r){
    15         scanf("%d",&cnt[pt]);
    16         return ;
    17     }
    18     int mid=(l+r)>>1;
    19     Build(l,mid,pt<<1);
    20     Build(mid+1,r,pt<<1|1);
    21     cnt[pt] = cnt[pt<<1]+cnt[pt<<1|1];
    22 }
    23 
    24 //区间查询Query(L,R,1,n,1)
    25 int Query(int L,int R,int l,int r,int pt){
    26     if( L<=l && R>=r ) return cnt[pt];
    27     int sum=0;
    28     int mid=(l+r)>>1;
    29     if( L<=mid ) sum += Query(L,R,l,mid,pt<<1);
    30     if( R>mid ) sum += Query(L,R,mid+1,r,pt<<1|1);
    31     return sum;
    32 }
    33 
    34 //单点更新Updata(pos,val,1,n,1)
    35 void Updata(int i,int add,int l,int r,int pt){
    36     if( l==r ){
    37         cnt[pt]+=add;
    38         return ;
    39     }
    40     int mid=(l+r)>>1;
    41     if( i<=mid ) Updata(i,add,l,mid,pt<<1);
    42     else Updata(i,add,mid+1,r,pt<<1|1);
    43     cnt[pt] = cnt[pt<<1]+cnt[pt<<1|1];
    44     return ;
    45 
    46 }
    47 
    48 
    49 int main()
    50 {
    51     int t,n,c,l,r,i;
    52     char cmd[10];
    53     scanf("%d",&t);
    54     for(c=1;c<=t;c++)
    55     {
    56         memset(cnt,0,sizeof(cnt));
    57         scanf("%d",&n);
    58         Build(1,n,1);
    59         printf("Case %d:
    ",c);
    60         while( 1 )
    61         {
    62             scanf("%s",cmd);
    63             if( cmd[0]=='E' ) break;            //结束
    64             if( cmd[0]=='Q' ){                  //区间询问
    65                 scanf("%d%d",&l,&r);
    66                 printf("%d
    ",Query(l,r,1,n,1));
    67             }
    68             else if( cmd[0]=='A' ){             //单点更新
    69                 scanf("%d%d",&i,&l);            //单点加
    70                 Updata(i,l,1,n,1);
    71             }
    72             else{                               //单点减
    73                 scanf("%d%d",&i,&l);
    74                 Updata(i,-l,1,n,1);
    75             }
    76         }
    77     }
    78     return 0;
    79 }

    区间修改,区间查询

      1 /* */
      2 # include <iostream>
      3 # include <stdio.h>
      4 # include <string.h>
      5 # include <cstdlib>
      6 # include <cmath>
      7 # include <climits>
      8 # include <list>
      9 # include <set>
     10 # include <map>
     11 # include <bitset>
     12 # include <deque>
     13 # include <cctype>
     14 # include <queue>
     15 # include <stack>
     16 # include <vector>
     17 using namespace std;
     18 
     19 typedef long long ll;
     20 const int maxn=1e5+10;
     21 ll sum[maxn<<2], lazy[maxn<<2];
     22 int N, Q;
     23 
     24 void pushup(int pt){
     25     sum[pt] = sum[pt<<1]+sum[pt<<1|1];
     26 }
     27 
     28 void pushdown(int pt, int l, int r)
     29 {
     30     if( lazy[pt] ){
     31         lazy[pt<<1] += lazy[pt];
     32         lazy[pt<<1|1] += lazy[pt];
     33         int m = (r+l)>>1;
     34         sum[pt<<1] += lazy[pt]*(m-l+1);
     35         sum[pt<<1|1] += lazy[pt]*(r-m);
     36         lazy[pt] = 0;
     37     }
     38 }
     39 
     40 void updata(int pt, int l, int r, int L, int R, int addv){
     41     if( L<=l && R>=r )
     42     {
     43         lazy[pt] += addv;
     44         sum[pt] += addv*(r-l+1);
     45         return ;
     46     }
     47 
     48     pushdown(pt, l, r);
     49     int m=(r+l)>>1;
     50     if( L<=m )
     51         updata(pt<<1, l, m, L, R, addv);
     52     if( R>m )
     53         updata(pt<<1|1, m+1, r, L, R, addv);
     54     pushup(pt);
     55 }
     56 
     57 
     58 
     59 void build(int pt, int l, int r)
     60 {
     61     if( l==r ){
     62         scanf("%I64d", &sum[pt]);
     63         return ;
     64     }
     65     int mid = (l+r)>>1;
     66     build(pt<<1, l, mid);
     67     build(pt<<1|1, mid+1, r);
     68     pushup(pt);
     69 }
     70 
     71 ll query(int pt, int l, int r, int L, int R ){
     72     if( L<=l && R>=r )
     73         return sum[pt];
     74     pushdown(pt, l, r);
     75     int m = (r+l)>>1;
     76     ll ans=0;
     77     if( L<=m )
     78         ans += query(pt<<1, l, m, L, R);
     79     if( R>m )
     80         ans += query(pt<<1|1, m+1, r, L, R);
     81     return ans;
     82 }
     83 
     84 int main()
     85 {
     86     int x, y, z;
     87     while( ~ scanf("%d %d", &N, &Q) ){
     88         memset(sum, 0, sizeof(sum));
     89         memset(lazy, 0, sizeof(lazy));
     90         build(1, 1, N);
     91         char str[2];
     92         while( Q-- ){
     93             scanf("%s", str);
     94             if( str[0]=='C' ){
     95                 scanf("%d %d %d", &x, &y, &z);
     96                 updata(1, 1, N, x, y, z);
     97             }
     98             else{
     99                 scanf("%d %d", &x, &y);
    100                 printf("%I64d
    ", query(1, 1, N, x, y));
    101             }
    102         }
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    Hibernate关于字段的属性设计
    Hibernate之增删查改常见错误
    Hibernate之实体类设计基本步骤
    Github开源之旅第二季-MarkDown
    8.Git命令(上)
    9.Git命令(下)
    7.Git Bash操作的四个坑(基本LINUX操作)
    Webserver-HTTP项目(深入理解HTTP协议)
    JAVA入门到精通-第94讲-山寨QQ项目8-好友在线提示
    JAVA入门到精通-第93讲-山寨QQ项目7-好友在线提示
  • 原文地址:https://www.cnblogs.com/wsy107316/p/11790224.html
Copyright © 2020-2023  润新知