zoukankan      html  css  js  c++  java
  • POJ3468_A Simple Problem with Integers(线段树/成段更新)

    解题报告

    题意:

    思路:

    线段树成段更新,区间求和。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define LL long long
    #define int_now int l,int r,int root
    using namespace std;
    LL sum[500000],lazy[500000];
    void push_up(int root,int l,int r) {
        sum[root]=sum[root*2]+sum[root*2+1];
    }
    void push_down(int rt,int l,int r) {
        if(lazy[rt]) {
            int m=(r-l+1);
            lazy[rt<<1]+=lazy[rt];
            lazy[rt<<1|1]+=lazy[rt];
            sum[rt<<1]+=lazy[rt]*(m-(m/2));
            sum[rt<<1|1]+=lazy[rt]*(m/2);
            lazy[rt]=0;
        }
    }
    void update(int root,int l,int r,int ql,int qr,LL v) {
        if(ql>r||qr<l)return;
        if(ql<=l&&r<=qr) {
            lazy[root]+=v;
            sum[root]+=v*(r-l+1);
            return ;
        }
        int mid=(l+r)/2;
        push_down(root,l,r);
        update(root*2,l,mid,ql,qr,v);
        update(root*2+1,mid+1,r,ql,qr,v);
        push_up(root,l,r);
    }
    LL q_sum(int root,int l,int r,int ql,int qr) {
        if(ql>r||qr<l)return 0;
        if(ql<=l&&r<=qr)return sum[root];
        push_down(root,l,r);
        int mid=(l+r)/2;
        return q_sum(root*2,l,mid,ql,qr)+q_sum(root*2+1,mid+1,r,ql,qr);
    }
    int main() {
        int n,q,i,j,ql,qr;
        LL a;
        scanf("%d%d",&n,&q);
        for(i=1; i<=n; i++) {
            scanf("%lld",&a);
            update(1,1,n,i,i,a);
        }
        char str[10];
        for(i=1; i<=q; i++) {
            scanf("%s",str);
            if(str[0]=='Q') {
                scanf("%d%d",&ql,&qr);
                printf("%lld
    ",q_sum(1,1,n,ql,qr));
            } else {
                scanf("%d%d%lld",&ql,&qr,&a);
                update(1,1,n,ql,qr,a);
            }
        }
        return 0;
    }
    


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

    Description

    You have N integers, A1A2, ... , 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 A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
    Each of the next Q lines represents an operation.
    "C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
    "Q a b" means querying the sum of AaAa+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.

  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7230594.html
Copyright © 2011-2022 走看看