题目
1819. 二哥的求和 时间限制 1000 ms 内存限制 128 MB 题目描述 某一天,calfcamel问二哥,有道数学题怎么做呀?二哥看了一下说我不会呀,于是二哥找到了你,请你帮他解决这个问题,这样二哥就可以鄙视calfcamel数学菜了。 给你一个长度为n的数组a[i],有q个询问,对于每次询问[l,r],输出 ∑ i=l r a i (i?l+1) ∑i=lrai(i?l+1) 也就是输出[l,r]这段区间上,第一个数乘以一,第二个数乘以2,第三个数乘以3,……的和。 输入数据 第一行为一个T,表示有T(T<= 5)组数据 对于每组数据: 第一行是一个n(n <= 100000) 第二行有n个数a[i] (0<=a[i] <=100000),下标从1开始,即a[1] – a[n] 第三行有一个q(q <=100000),表示询问的数目 接下来q行,每行有两个整数l,r 输出数据 对于每一组数据,第一行输出”Case x: ” (冒号后有一空格) 接下来q行,每行输出询问的答案 文件最后使用换行符结束文件 样例输入 复制 2 3 1 2 3 1 1 3 5 1 2 3 4 5 3 1 5 2 4 3 5 样例输出 复制 Case 1: 14 Case 2: 55 20 26 样例说明 数据比较大,C/C++请使用scanf读入 ,使用cin可能会超时。 本题目最后答案超出int,C/C++请使用long long防止溢出
分析:先用一个sum[i]维护一个前i的和,再用一个ai[i]来维护a[i]*i的和,这样就可以快速求出l,r区间的和了(公式:ans=ai[r]-ai[l-1]-(sum[r]-sum[l-1])*(l-1))
#define debug #include<stdio.h> #include<math.h> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<functional> #include<iomanip> #include<map> #include<set> #define f first #define s second #define pb push_back using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll>PLL; typedef pair<int,ll>Pil; const ll INF = 0x3f3f3f3f; const double inf=1e8+100; const double eps=1e-8; const ll maxn =1e6+300; const int N = 1e4+10; const ll mod=1e9+7; //define ll a[maxn]; ll ai[maxn]; ll sum[maxn]; //前缀和 a[i],a[i]*i void sum_add() { int t,i; // cin>>t; scanf("%d",&t); for(i=1; i<=t; i++) { ll n; scanf("%lld",&n); //cout case printf("Case %d: \n",i); for(ll j=1; j<=n; j++) { cin>>a[j]; sum[j]=sum[j-1]+a[j]; ai[j]=ai[j-1]+a[j]*j; // cout<<a[j]<<" "<<ai[j]<<endl; } // ll q; scanf("%lld",&q); while(q--) { ll l,r; scanf("%lld %lld",&l,&r); ll ans=ai[r]-ai[l-1]-(sum[r]-sum[l-1])*(l-1); printf("%lld\n",ans); } } } //--solve void solve() { int i,j,tt=1; sum_add(); } int main() { // ios_base::sync_with_stdio(false); #ifdef debug freopen("in.txt", "r", stdin); // freopen("out.txt","w",stdout); #endif // cin.tie(0); // cout.tie(0); solve(); /* #ifdef debug fclose(stdin); fclose(stdout); system("out.txt"); #endif */ return 0; }