题意
给出整数数组,求q次,每次给
,求
。答案对1,000,000,007取模
题解
做法一
每次询问暴力求解。复杂度,不可接受。预计通过0%。
做法二
考虑对做法一进行优化,如果每次询问只枚举i,剩下的。这部分可以预处理出a的前缀和sum(即sum[i]=a[1]+...+a[n]),
内查询。
复杂度。预计通过30%。
做法三
观察到,所以
。
那么可以预处理的前缀和和
的前缀和,每次询问
内查询。
复杂度。预计通过100%。
代码
#include <bits/stdc++.h>
#define ll long long
const int maxn = 100100;
const int mod = 1000000007;
class Solution {
public:
/**
* 多次求交叉乘
* @param a int整型vector a1,a2,...,an
* @param query int整型vector l1,r1,l2,r2,...,lq,rq
* @return int整型vector
*/
ll s[maxn], s2[maxn];
vector<int> getSum(vector<int>& a, vector<int>& query) {
int n = a.size();
int q = query.size()/2;
s[0]=s2[0]=0;
for (int i=1;i<=n;i++) {
s[i]=s[i-1]+a[i-1];
s2[i]=s2[i-1]+a[i-1]*(ll)a[i-1];
}
vector <int> ret;
for (int i=1;i<=q;i++) {
int l=query[2*i-2], r=query[2*i-1];
ll ans = ((s[r]-s[l-1])*(s[r]-s[l-1])-(s2[r]-s2[l-1]))/2;
ret.push_back(ans % mod);
}
return ret;
}
};


京公网安备 11010502036488号