zoukankan      html  css  js  c++  java
  • codevs 1081 线段树练习 2 区间更新 单点查询 无lazy

    题目描述 Description

    给你N个数,有两种操作


    1:给区间[a,b]的所有数都增加X


    2:询问第i个数是什么?

    输入描述 Input Description

    第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。

    输出描述 Output Description

    对于每个询问输出一行一个答案

    样例输入 Sample Input

    3

    1

    2

    3

    2

    1 2 3 2

    2 3

    样例输出 Sample Output

    5

    数据范围及提示 Data Size & Hint

    数据范围

    1<=n<=100000

    1<=q<=100000

    题意:  中文题意
     
    题解: 裸线段树  区间更新 单点查询  无lazy
     
     1 //code by  drizzle
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<algorithm>
     6 #include<vector>
     7 #define ll __int64
     8 #define PI acos(-1.0)
     9 #define mod 1000000007
    10 using namespace std;
    11 struct node
    12 {
    13     int l,r,value;
    14 }tree[400005];
    15 void buildtree(int root,int left,int right)
    16 {
    17     tree[root].l=left;
    18     tree[root].r=right;
    19     if(left==right)
    20     {
    21         scanf("%d",&tree[root].value);
    22         return ;
    23     }
    24     int mid=(left+right)>>1;
    25     buildtree(root<<1,left,mid);
    26     buildtree(root<<1|1,mid+1,right);
    27     tree[root].value=tree[root<<1].value+tree[root<<1|1].value;
    28 }
    29 void updata(int c,int left,int right,int root)
    30 {
    31     if(tree[root].l==left&&tree[root].r==right&&left==right)
    32     {
    33         tree[root].value+=c;
    34         return;
    35     }
    36     int mid=(tree[root].l+tree[root].r)>>1;
    37     if(right<=mid)
    38         updata(c,left,right,root<<1);
    39     else
    40     {
    41         if(left>mid)
    42             updata(c,left,right,root<<1|1);
    43         else
    44         {
    45             updata(c,left,mid,root<<1);
    46             updata(c,mid+1,right,root<<1|1);
    47         }
    48     }
    49     tree[root].value=tree[root<<1].value+tree[root<<1|1].value;
    50 }
    51 int  query(int left ,int right,int root)
    52 {
    53     if(tree[root].l==left&&tree[root].r==right)
    54      {
    55          return tree[root].value;
    56       }
    57     int mid=(tree[root].l+tree[root].r)>>1;
    58     if(right<=mid)
    59     return query(left,right,root<<1);
    60     else
    61     {
    62         if(left>mid)
    63         return query(left,right,root<<1|1);
    64         else
    65         return query(left,mid,root<<1)+query(mid+1,right,root<<1|1);
    66     }
    67 }
    68 int n;
    69 int exm;
    70 int q;
    71 int flag;
    72 int lll,rrr,add;
    73 int cha;
    74 int main()
    75 {
    76     while(scanf("%d",&n)!=EOF)
    77     {
    78         buildtree(1,1,n);
    79         scanf("%d",&q);
    80         for(int i=1;i<=q;i++)
    81         {
    82             scanf("%d",&flag);
    83             if(flag==1)
    84             {
    85                 scanf("%d %d %d",&lll,&rrr,&add);
    86                 updata(add,lll,rrr,1);
    87             }
    88             if(flag==2)
    89             {
    90                scanf("%d",&cha);
    91                printf("%d
    ",query(cha,cha,1));
    92             }
    93         }
    94     }
    95     return 0;
    96 }
     
  • 相关阅读:
    偏函数
    通过local对象的使用,分析flask中全局request对象为神魔不同的视图函数中不会混乱--协助解读flask的源码
    flask安装即web框架介绍
    事件
    文件复制工具
    非文本文件的写入
    文件读取
    sys模块
    datetime模块
    事件冒泡与捕获
  • 原文地址:https://www.cnblogs.com/hsd-/p/5691506.html
Copyright © 2011-2022 走看看