zoukankan      html  css  js  c++  java
  • BZOJ3155: Preprefix sum

    BZOJ3155: Preprefix sum


    题目描述

    传送门

    题目分析

    分析可以发现题目貌似是在求这个东西:

    [sum_{i=1}^nsum_{j=1}^ia_j ]

    我们可以稍稍转化一下这个式子,这个式子实际上可以化成:

    [sum_{i=1}^n(n-i+1)a_i ]

    然后这个式子等价于

    [sum_{i=1}^nn imes a[i]-(i-1) imes a[i] ]

    前面的部分和没有系数(i),我们把它提出去。

    [sum_{i=1}^n n imes a[i]+sum_{i=1}^n(i-1) imes a[i] ]

    显而易见的这个前后两部分都可以通过线段树快速计算。

    是代码呢

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define ls rt<<1
    #define rs rt<<1|1
    #define mid ((l+r)>>1)
    const int MAXN=1e5+7;
    int n,m;
    ll add[MAXN<<2],s[MAXN<<2],ss[MAXN<<2],st[MAXN<<2],adds[MAXN<<2],b[MAXN],s1,s2,a[MAXN];
    char opt[10];
    inline void pushup(int rt)
    {
    	s[rt]=s[ls]+s[rs];
    	ss[rt]=ss[ls]+ss[rs];
    }
    inline void build(int l,int r,int rt)
    {
    	if(l==r){
    		s[rt]=a[l];
    		ss[rt]=b[l];
    		return;
    	}
    	build(l,mid,ls);build(mid+1,r,rs);
    	pushup(rt);
    }
    inline void change(int l,int r,int rt,int x,ll k,ll t)
    {
    	if(l==r){
    		s[rt]=k;
    		ss[rt]=t;
    		return;
    	}
    	if(x<=mid) change(l,mid,ls,x,k,t);
    	else change(mid+1,r,rs,x,k,t);
    	pushup(rt);
    }
    inline void query(int L,int R,int l,int r,int rt)
    {
    	if(L<=l&&r<=R){
    		s1+=s[rt];
    		s2+=ss[rt];
    		return;
    	}
    	if(L<=mid) query(L,R,l,mid,ls);
    	if(R>mid) query(L,R,mid+1,r,rs);
    }
    inline int read()
    {
        int x=0,c=1;
        char ch=' ';
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        while(ch=='-')c*=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*c;
    }
    int main()
    {
    	n=read();m=read();
    	for(int i=1;i<=n;i++) a[i]=read(),b[i]=a[i]*(i-1);
    	build(1,n,1);
    	while(m--){
    		scanf("%s",opt); ll x=read();
    		if(opt[0]=='Q') {
    			s1=0;s2=0;
    			query(1,x,1,n,1);
    			printf("%lld
    ", s1*x-s2);
    		} else {
    			ll k=read(),t=k*(x-1);
    			change(1,n,1,x,k,t);
    		}
    	}
    }
    
  • 相关阅读:
    写给自己的话
    软件开发之技能梳理
    《创新者的窘境》读书笔记
    我的四年踩坑史以及思考
    认识问题和求解问题的一种思考框架
    《时间的秩序》读书笔记
    从JSON中自动生成对应的对象模型
    考考你:一道题引发的小思考
    哈!如果一生只如花样短暂
    使用正则表达式抽取所需文本
  • 原文地址:https://www.cnblogs.com/victorique/p/10384292.html
Copyright © 2011-2022 走看看