zoukankan      html  css  js  c++  java
  • POJ

    You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

    Input

    The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
    The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
    Each of the next Q lines represents an operation.
    "C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
    "Q a b" means querying the sum of Aa, Aa+1, ... , Ab.

    Output

    You need to answer all Q commands in order. One answer in a line.

    Sample Input

    10 5
    1 2 3 4 5 6 7 8 9 10
    Q 4 4
    Q 1 10
    Q 2 4
    C 3 6 3
    Q 2 4
    

    Sample Output

    4
    55
    9
    15

    Hint

    The sums may exceed the range of 32-bit integers
    解题思路:利用懒惰标记更新区间并求区间和
    代码如下:
      1 #include<iostream>
      2 #include<stdio.h>
      3 using namespace std;
      4 
      5 const int MAXN = 500005;
      6 int a[MAXN];
      7 long long int tree[MAXN*4];
      8 long long int lazy[MAXN*4];
      9 int N,Q;
     10 string s;
     11 int x , y, z;
     12 void push_down(int l ,int r ,int rt)
     13 {
     14     int m = (l+r)/2;
     15     
     16     if(lazy[rt])
     17     {
     18         tree[rt*2] += lazy[rt]*(m-l+1);
     19         tree[rt*2+1] += lazy[rt]*(r-m);
     20         lazy[rt*2] += lazy[rt];
     21         lazy[rt*2+1] += lazy[rt];
     22         lazy[rt] = 0; 
     23     }
     24 }
     25 void bulid_tree(int l ,int r ,int rt)
     26 {
     27     if(l==r)
     28     {
     29         tree[rt] = a[l];
     30         return ;
     31     }
     32     int m = (l+r)/2;
     33     
     34     bulid_tree(l,m,rt*2);
     35     bulid_tree(m+1,r,rt*2+1);
     36     tree[rt] = tree[rt*2]+tree[rt*2+1];
     37 }
     38 
     39 long long int Query(int x ,int y ,int l ,int r ,int rt)
     40 {
     41     long long sum = 0 ;
     42     if(x<=l&&r<=y)
     43     {
     44         return tree[rt];
     45     }
     46     int m = (l+r)/2;
     47     push_down(l,r,rt);
     48     if(x<=m)
     49     {
     50         sum += Query(x,y,l,m,rt*2);
     51     }
     52     if(m<y)
     53     {
     54         sum += Query(x,y,m+1,r,rt*2+1);
     55     }
     56     return sum;
     57 }
     58 void Update(int x ,int y ,int k ,int l ,int r ,int rt)
     59 {
     60     if(x<=l&&y>=r)
     61     {
     62         tree[rt] += k*(r-l+1);
     63         lazy[rt] += k;
     64         return ;
     65     }
     66     push_down(l,r,rt);
     67     int m = (l+r)/2;
     68     if(x<=m)
     69     {
     70         Update(x,y,k,l,m,rt*2);
     71     }
     72     if(y>m)
     73     {
     74         Update(x,y,k,m+1,r,rt*2+1);
     75     }
     76     tree[rt] = tree[rt*2]+tree[rt*2+1];
     77 }
     78 int main()
     79 {
     80     scanf("%d%d",&N,&Q);
     81     for(int i = 1 ; i <= N;i++)
     82     {
     83         scanf("%d",&a[i]);
     84     }
     85     bulid_tree(1,N,1);
     86     while(Q--)
     87     {
     88         cin>>s;
     89         if(s[0]=='Q')
     90         {
     91             scanf("%d%d",&x,&y);
     92             printf("%lld
    ",Query(x,y,1,N,1));
     93             
     94         }
     95         else
     96         if(s[0]=='C')
     97         {
     98             scanf("%d%d%d",&x,&y,&z);
     99             Update(x,y,z,1,N,1);
    100         }
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    JavaScript技巧
    函数
    windows实现应用双开
    vue组件中name属性有啥作用
    文本超出长度后多余部分显示省略号
    el-tree控件动态获取数据赋值给treeData渲染问题:render-after-expand属性
    elementUI弹框dialog的打开和关闭
    自然语言处理工具之gensim / 预训练模型 word2vec doc2vec
    Linux 根目录空间不足解决方法
    文本挖掘预处理之分词 / 向量化 / TF-IDF / Hash trick 附代码 Demo
  • 原文地址:https://www.cnblogs.com/yewanting/p/10800242.html
Copyright © 2011-2022 走看看