zoukankan      html  css  js  c++  java
  • POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新

    A Simple Problem with Integers
    Time Limit: 5000MS   Memory Limit: 131072K
    Total Submissions: 105742   Accepted: 33031
    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


    思路:线段树区间跟新 + lazy-target标记

    (注意数据范围,long long)

    代码:

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    const int maxn=100005;
    long long sum[maxn<<2];
    long long add[maxn<<2];
    void pushup(int rt) {
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void pushdown(int rt, int len) {
        if(add[rt]) {
            add[rt<<1]+=add[rt];
            add[rt<<1|1]+=add[rt];
            sum[rt<<1]+=(len-(len>>1))*add[rt];
            sum[rt<<1|1]+=(len>>1)*add[rt];
            add[rt]=0;
        }
    }
    void build(int l, int r, int rt) {
        add[rt]=0;
        if(l==r) {
            scanf("%lld",&sum[rt]);
            return;
        }
        int mid=(l+r)>>1;
        build(lson);
        build(rson);
        pushup(rt);
    }
    void update(int L, int R, int val, int l, int r, int rt) {
        if(L<=l&&r<=R) {
            sum[rt]+=(r-l+1)*val;
            add[rt]+=val;
            return;
        }
        pushdown(rt,r-l+1);
        int mid=(l+r)>>1;
        if(L<=mid) update(L,R,val,lson);
        if(R>mid) update(L,R,val,rson);
        pushup(rt);
    }
    long long query(int L, int R, int l, int r, int rt) {
        if(L<=l&&r<=R) {
            return sum[rt];
        }
        pushdown(rt,r-l+1);
        int mid=(l+r)>>1;
        long long cnt=0;
        if(L<=mid) cnt+=query(L,R,lson);
        if(R>mid) cnt+=query(L,R,rson);
        return cnt;
    }
    int main() {
        int n,q;
        while(~scanf("%d%d",&n,&q)) {
            build(1,n,1);
            char s[10];
            for(int i=1;i<=q;i++) {
                scanf("%s",s);
                if(s[0]=='Q') {
                    int L,R;long long result;scanf("%d%d",&L,&R);
                    result=query(L,R,1,n,1);
                    printf("%lld
    ",result);
                } else if(s[0]=='C') {
                    int L,R,val;scanf("%d%d%d",&L,&R,&val);
                    update(L,R,val,1,n,1);
                }
            }
        }
        return 0;
    }
    


  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7775999.html
Copyright © 2011-2022 走看看