• BZOJ3155: Preprefix sum


    题解 区间加区间查询线段树裸题  用树状数组实现 常数小

    /**************************************************************
        Problem: 3155
        User: c20161007
        Language: C++
        Result: Accepted
        Time:464 ms
        Memory:4416 kb
    ****************************************************************/
     
    #include <bits/stdc++.h>
    const int MAXN=1e5+10;
    #define ll long long
    using namespace std;
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return f*x;
    }
    ll a[MAXN],b[MAXN];int n,q;
    int get_id(int x){return x&(-x);}
    void add1(int x,ll vul){
        if(x<=0)return ;
        for(int i=x;i<=n;i+=get_id(i))a[i]+=vul;
        return ;
    }
    void add2(int x,ll vul){
        if(x<=0)return ;
        for(int i=x;i>0;i-=get_id(i))b[i]+=vul;
    }
    ll Sum1(int x){
        if(x<=0)return 0;
        ll ans=0;
        for(int i=x;i>0;i-=get_id(i))ans+=a[i];
        return ans;
    }
    ll Sum2(int x){
        if(x<=0)return 0;
        ll ans=0;
        for(int i=x;i<=n;i+=get_id(i))ans+=b[i];
        return ans;
    }
    ll A[MAXN],sum[MAXN];
    int main(){
        n=read();q=read();
        for(int i=1;i<=n;i++)A[i]=read();
        for(int i=1;i<=n;i++)sum[i]=A[i]+sum[i-1];
        int p=n;n++;
        for(int i=1;i<=p;i++)add1(i,1ll*sum[i]*i),add2(i,sum[i]),add1(i-1,-1*sum[i]*(i-1)),add2(i-1,-1*sum[i]);
        char str[11];int pos;ll vul,key;
        for(int i=1;i<=q;i++){
        scanf(" %s",str);
        if(str[0]=='Q')pos=read(),printf("%lld
    ",Sum1(pos)+1ll*pos*Sum2(pos+1));
        else{
            pos=read();vul=read();key=vul;vul-=A[pos];A[pos]=key;
            add1(p,1ll*vul*p),add2(p,vul);
            add1(pos-1,-1*vul*(pos-1)),add2(pos-1,-1*vul);
        }
        }
        return 0;
    }
    

                   3155: Preprefix sum
                Time Limit: 1 Sec  Memory Limit: 512 MB
                Submit: 2060  Solved: 892
                [Submit][Status][Discuss]
    Description


    Input

    第一行给出两个整数N,M。分别表示序列长度和操作个数
    接下来一行有N个数,即给定的序列a1,a2,....an
    接下来M行,每行对应一个操作,格式见题目描述

    Output

    对于每个询问操作,输出一行,表示所询问的SSi的值。

    Sample Input
    5 3

    1 2 3 4 5

    Query 5

    Modify 3 2

    Query 5
    Sample Output
    35

    32
    HINT

    1<=N,M<=100000,且在任意时刻0<=Ai<=100000

    Source

    Katharon+#1

  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/wang9897/p/9426369.html
Copyright © 2020-2023  润新知