[ABC423E]Sum of Subarrays题解
时间限制:2 秒 / 内存限制:1024 MiB
得分: 475 分
《A - 回文数》《A - 回文数》《A - 回文数》
问题描述
你得到一个长度为 N 的整数序列 A=(A1,A2,…,AN) 。
给出 Q 个查询,因此为每个查询找到答案。
在 i - 个查询中,给定整数 Li 和 Ri ,因此将 l=Li∑Rir=l∑Rij=l∑rAj 作为答案。
《A - 回文数》《A - 回文数》《A - 回文数》
约束条件
- 1≤N,Q≤3×105
- 1≤Ai≤100
- 1≤Li≤Ri≤N
- 所有输入值都是整数。
《A - 回文数》《A - 回文数》《A - 回文数》
输入
输入从标准输入中按以下格式给出:
N Q
A1 A2 … AN
L1 R1
L2 R2
⋮
LQ RQ
《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∑4r=l∑4j=l∑rAj 。
-
当 l=2,r=2 时, j=l∑rAj=1 。
-
当 l=2,r=3 时, j=l∑rAj=4 。
-
当 l=2,r=4 时, j=l∑rAj=7 。
-
当 l=3,r=3 时, j=l∑rAj=3 。
-
当 l=3,r=4 时, j=l∑rAj=6 。
-
当 l=4,r=4 时, j=l∑rAj=3 。
从上面,要计算的是 (1+4+7)+(3+6)+3=24 。
思路
设b[i]为前缀和,则原式为
于是,设
所以
((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;
}

浙公网安备 33010602011771号