• 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);
    		}
    	}
    }
    
  • 相关阅读:
    SDOI2018 旧试题
    JSOI2004 平衡点 / 吊打XXX
    SDOI2017 数字表格
    CQOI2015 选数
    BZOJ2741 【FOTILE模拟赛】L
    BZOJ4103 [Thu Summer Camp 2015]异或运算
    BZOJ3689 异或之
    BZOJ4128 Matrix
    HNOI2006 最短母串问题
    SCOI2013 密码
  • 原文地址:https://www.cnblogs.com/victorique/p/10384292.html
Copyright © 2020-2023  润新知