[ABC423E]Sum of Subarrays题解

时间限制:2 秒 / 内存限制:1024 MiB

得分: 475 分

《A - 回文数》《A - 回文数》《A - 回文数》

问题描述

你得到一个长度为 N 的整数序列 A=(A1​,A2​,…,AN​) 。

给出 Q 个查询,因此为每个查询找到答案。

在 i - 个查询中,给定整数 Li​ 和 Ri​ ,因此将 l=Li​∑Ri​​r=lRi​​j=lrAj​ 作为答案。

《A - 回文数》《A - 回文数》《A - 回文数》

约束条件

  • 1≤N,Q≤3×105
  • 1≤Ai​≤100
  • 1≤Li​≤Ri​≤N
  • 所有输入值都是整数。

《A - 回文数》《A - 回文数》《A - 回文数》

输入

输入从标准输入中按以下格式给出:

N Q
A1​ A2​ … ANL1​ R1​
L2​ R2​
⋮
LQRQ
《A - 回文数》《A - 回文数》《A - 回文数》

输出

输出 Q 行。第 i 行应包含第 i 个查询的答案。


《A - 回文数》《A - 回文数》《A - 回文数》

示例输入 1 复制

复制
5 4
2 1 3 3 1
2 4
1 4
1 5
3 3
《A - 回文数》《A - 回文数》《A - 回文数》

示例输出 1 复制

复制
24
44
74
3

我们解释第一个查询。

要计算的是 l=2∑4​r=l∑4​j=lrAj​ 。

  • 当 l=2,r=2 时, j=lrAj​=1 。

  • 当 l=2,r=3 时, j=lrAj​=4 。

  • 当 l=2,r=4 时, j=lrAj​=7 。

  • 当 l=3,r=3 时, j=lrAj​=3 。

  • 当 l=3,r=4 时, j=lrAj​=6 。

  • 当 l=4,r=4 时, j=lrAj​=3 。

从上面,要计算的是 (1+4+7)+(3+6)+3=24 。

思路

设b[i]为前缀和,则原式为

        \sum_{l=L}^{R}\sum_{r=l}^{R}b_r-b_{l-1}=\sum_{i=L}^{R}(i-L+1)b_i-\sum_{i=L-1}^{R-1}(R-i)b_i

于是,设

        c_i=\sum_{j=1}^{i}b_j \textup{ }\textup{ } \textup{ } \textup{ } d_i=\sum_{j=1}^{i}jb_j

        s_i=\sum_{j=i}^{n}b_j \textup{ }\textup{ } \textup{ } \textup{ } e_i=\sum_{j=i}^{n}(n-j+1)b_j

所以

((d[r]-d[l-1])-(c[r]-c[l-1])*(l-1))-((e[l-1]-e[r])-(c2[l-1]-c2[r])*(n-r+1))

为答案。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,q,a[300005],b[300005],c[300005],d[300005],e[300005],c2[300005],l,r,lk=0;
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=b[i-1]+a[i];
		c[i]=c[i-1]+b[i];
		d[i]=d[i-1]+i*b[i];
		//cout<<b[i]<<" "<<c[i]<<" "<<d[i]<<endl;
	}
	for(int i=n;i>=0;i--){
		e[i]=e[i+1]+b[i]*(n-i+1);
		c2[i]=c2[i+1]+b[i];
	}
	for(int i=0;i<=n;i++){
		//cout<<e[i]<<" "<<c2[i]<<endl;
	}
	for(int i=1;i<=q;i++){
		cin>>l>>r;
		lk=0;
		lk+=((d[r]-d[l-1])-(c[r]-c[l-1])*(l-1));
		//cout<<d[r]-d[l-1]<<" "<<c[r]-c[l-1]<<" "<<l-1<<" "<<lk<<endl; 
		lk-=((e[l-1]-e[r])-(c2[l-1]-c2[r])*(n-r+1));
		cout<<lk<<endl;
	}
	return 0;
}

posted @ 2025-10-01 08:43  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源