zoukankan      html  css  js  c++  java
  • POJ 3468 A Simple Problem with Integers

    A Simple Problem with Integers
    Time Limit: 5000MS   Memory Limit: 131072K
    Total Submissions: 92522   Accepted: 28778
    Case Time Limit: 2000MS

    Description

    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.

    Source

     
     
     
    解析:线段树,区间更新,区间查询。
     
     
     
     1 #include <cstdio>
     2 
     3 struct Node{
     4     int l, r;
     5     long long val, add;
     6 };
     7 Node node[100005<<2];
     8 
     9 void build(int v, int l, int r)
    10 {
    11     node[v].l = l;
    12     node[v].r = r;
    13     node[v].add = 0;
    14     if(node[v].l == node[v].r){
    15         scanf("%I64d", &node[v].val);
    16         return;
    17     }
    18     int mid = (l+r)>>1;
    19     build(v<<1, l, mid);
    20     build(v<<1|1, mid+1, r);
    21     node[v].val = node[v<<1].val+node[v<<1|1].val;
    22 }
    23 
    24 void pushDown(int v)
    25 {
    26     if(node[v].add){
    27         node[v<<1].add += node[v].add;
    28         node[v<<1|1].add += node[v].add;
    29         int m = node[v].r-node[v].l+1;
    30         node[v<<1].val += (m-(m>>1))*node[v].add;
    31         node[v<<1|1].val += (m>>1)*node[v].add;
    32         node[v].add = 0;
    33     }
    34 }
    35 
    36 long long query(int v, int l, int r)
    37 {
    38     if(node[v].l == l && node[v].r == r)
    39         return node[v].val;
    40     pushDown(v);    //更新子区间
    41     int mid = (node[v].l+node[v].r)>>1;
    42     if(r <= mid)
    43         return query(v<<1, l, r);
    44     else if(l > mid)
    45         return query(v<<1|1, l, r);
    46     else
    47         return query(v<<1, l, mid)+query(v<<1|1, mid+1, r);
    48 }
    49 
    50 void update(int v, int l, int r, int c)
    51 {
    52     if(node[v].l == l && node[v].r == r){
    53         node[v].val += (r-l+1)*c;
    54         node[v].add += c;
    55         return;
    56     }
    57     pushDown(v);    //更新子区间
    58     int mid = (node[v].l+node[v].r)>>1;
    59     if(r <= mid)
    60         update(v<<1, l, r, c);
    61     else if(l > mid)
    62         update(v<<1|1, l, r, c);
    63     else{
    64         update(v<<1, l, mid, c);
    65         update(v<<1|1, mid+1, r, c);
    66     }
    67     node[v].val = node[v<<1].val+node[v<<1|1].val;
    68 }
    69 
    70 int main()
    71 {
    72     int N, Q;
    73     scanf("%d%d", &N, &Q);
    74     build(1, 1, N);
    75     char order[5];
    76     int a, b, c;
    77     while(Q--){
    78         scanf("%s", order);
    79         if(order[0] == 'Q'){
    80             scanf("%d%d", &a, &b);
    81             printf("%I64d
    ", query(1, a, b));
    82         }
    83         else{
    84             scanf("%d%d%d", &a, &b, &c);
    85             update(1, a, b, c);
    86         }
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    android 项目
    input keyevent 数字对应的操作
    logcat 使用方法
    android查看内存使用情况
    图片点击放大效果
    禁止img图片拖动在新窗口打开
    人工智能
    游戏开发
    随手做的一个模拟弹出窗口
    Html的<meta>标签使用方法及用例
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/5674834.html
Copyright © 2011-2022 走看看