ABC480D 题解
Andy16673328152 · · 题解
Solution
序列区间和可以转化成前缀和问题,所以答案为
但是
把
可以发现每一层数的和是
至于上面的层数有多少,可以预处理对于每个 upper_bound,最后下标减
Code
#include <bits/stdc++.h>
using namespace std;
long long n,q,a[400001],s[400001],ss[400001],p[400001];long long l,r;
/*
1 11 111 1111
1|1 10|1 10 100|1 10 100 1000
1 3 6 10
*/
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
for(int i=1;i<=n;i++){
ss[i]=ss[i-1]+s[i];
p[i]=1ll*i*(i+1)/2;
}
while(q--){
cin>>l>>r;
long long ansl=0,ansr=0;
long long d=upper_bound(p+1,p+n+1,r)-p-1,dd=upper_bound(p+1,p+n+1,l-1)-p-1;
ansr=ss[d]+s[r-p[d]];
ansl=ss[dd]+s[(l-1)-p[dd]];
cout<<ansr-ansl<<'\n';
}
return 0;
}
AC Record