• P3372 【模板】线段树 1 洛谷


    https://www.luogu.org/problem/show?pid=3372

    题目描述

    如题,已知一个数列,你需要进行下面两种操作:

    1.将某区间每一个数加上x

    2.求出某区间每一个数的和

    输入输出格式

    输入格式:

    第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

    第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

    接下来M行每行包含3或4个整数,表示一个操作,具体如下:

    操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k

    操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

    输出格式:

    输出包含若干行整数,即为所有操作2的结果。

    输入输出样例

    输入样例#1:
    5 5
    1 5 4 2 3
    2 2 4
    1 2 3 2
    2 3 4
    1 1 5 1
    2 1 4
    输出样例#1:
    11
    8
    20

    说明

    时空限制:1000ms,128M

    数据规模:

    对于30%的数据:N<=8,M<=10

    对于70%的数据:N<=1000,M<=10000

    对于100%的数据:N<=100000,M<=100000

    (数据已经过加强^_^,保证在int64/long long数据范围内)

    样例说明:

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstdio>
     4 
     5 #define maxn 200000
     6 #define LL long long
     7 
     8 using namespace std;
     9 
    10 LL n,m,if_,x,y,k;
    11 
    12 struct node
    13 {
    14     LL l,r,mid,dis,flag;
    15 }tree[maxn<<2];
    16 
    17 void tree_up(LL now)
    18 {
    19     tree[now].dis=tree[now<<1].dis+tree[now<<1|1].dis;
    20     return ;
    21 }
    22 
    23 void tree_build(LL now,LL l,LL r)
    24 {
    25     tree[now].l=l,tree[now].r=r;
    26     if(l==r)
    27     {
    28         cin>>tree[now].dis;
    29         return ;
    30     }
    31     tree[now].mid=(tree[now].l+tree[now].r)>>1;
    32     tree_build(now<<1,l,tree[now].mid);
    33     tree_build(now<<1|1,tree[now].mid+1,r);
    34     tree_up(now);
    35 }
    36 
    37 void tree_down(LL now)
    38 {
    39     tree[now<<1].flag+=tree[now].flag;
    40     tree[now<<1].dis+=tree[now].flag*(tree[now<<1].r-tree[now<<1].l+1);
    41     tree[now<<1|1].flag+=tree[now].flag;
    42     tree[now<<1|1].dis+=tree[now].flag*(tree[now<<1|1].r-tree[now<<1|1].l+1);
    43     tree[now].flag=0;     return ;
    44 }
    45 
    46 void tree_change_many(LL now,LL l,LL r,LL x)
    47 {
    48     if(tree[now].l==l&&tree[now].r==r)
    49     {
    50         tree[now].flag+=x;
    51         tree[now].dis+=x*(r-l+1);
    52         return ;
    53     }
    54     if(tree[now].flag) tree_down(now);
    55     if(tree[now].mid>=r)     tree_change_many(now<<1,l,r,x);
    56     else if(tree[now].mid<l) tree_change_many(now<<1|1,l,r,x);
    57     else
    58     {
    59         tree_change_many(now<<1,l,tree[now].mid,x);
    60         tree_change_many(now<<1|1,tree[now].mid+1,r,x);
    61     }
    62     tree_up(now);
    63 }
    64 
    65 LL tree_query(LL now,LL l,LL r)
    66 {
    67     if(tree[now].l==l&&tree[now].r==r)    return tree[now].dis;
    68     if(tree[now].flag)    tree_down(now); 
    69     if(tree[now].mid>=r)       return tree_query(now<<1,l,r);
    70     else if(tree[now].mid<l)  return tree_query(now<<1|1,l,r);
    71     else return tree_query(now<<1,l,tree[now].mid)+tree_query(now<<1|1,tree[now].mid+1,r);
    72 }
    73 
    74 int main()
    75 {
    76     cin>>n>>m;
    77     tree_build(1,1,n);
    78     while(m--)
    79     {
    80         cin>>if_;
    81         if(if_==1)
    82         {
    83             cin>>x>>y>>k;
    84             tree_change_many(1,x,y,k);
    85         }
    86         else
    87         {
    88             cin>>x>>y;
    89             cout<<tree_query(1,x,y)<<endl;
    90         }
    91     } 
    92     return 0;
    93 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Java 解惑:Random 种子的作用、含参与不含参构造函数区别
    Linux系统网络性能实例分析
    数据库服务器的性能调优-续
    Spring代理模式及AOP基本术语
    Spring框架总结
    单例模式和多例模式
    jqueryUI小案例
    Ajax讲解
    数据校验和国际化
    文件上传(多文件上传)/下载
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6642042.html
Copyright © 2020-2023  润新知