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 }
  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/yewanting/p/10800242.html
Copyright © 2011-2022 走看看