NC19798 区间权值

题意: 给定长度为 n n n的序列 a a a w w w,求 ∑ l = 1 n ∑ r = l n f ( l , r ) \sum_{l=1}^{n}\sum_{r=l}^{n}f(l,r) l=1nr=lnf(l,r),其中 f ( l , r ) = ( ∑ i = l r a i ) × w r − l + 1 f(l,r)=(\sum_{i=l}^{r}a_i)\times w_{r-l+1} f(l,r)=(i=lrai)×wrl+1,答案对 1 0 9 + 7 10^9+7 109+7取模。
数据范围 1 ≤ n ≤ 3 × 1 0 5 , 1 ≤ a i ≤ 1 0 7 , 1 ≤ w i ≤ 1 0 7 1\leq n\leq 3\times10^5,1\leq a_i\leq 10^7, 1\leq w_i\leq 10^7 1n3×105,1ai107,1wi107

题解:
先计算 ∑ i = l r a i \sum_{i=l}^{r}a_i i=lrai

  • 首先考虑长度为 1 1 1 a [ 1 , 1 ] + a [ 2 , 2 ] + . . . + a [ n , n ] = a [ 1 , n ] a[1,1]+a[2,2]+...+a[n,n]=a[1,n] a[1,1]+a[2,2]+...+a[n,n]=a[1,n]
  • 继续考虑长度为 2 2 2 a [ 1 , 2 ] + a [ 2 , 3 ] + a [ 3 , 4 ] + . . . a [ n − 3 , n − 1 ] + a [ n − 2 , n ] a[1,2]+a[2,3]+a[3,4]+...a[n-3,n-1]+a[n-2,n] a[1,2]+a[2,3]+a[3,4]+...a[n3,n1]+a[n2,n],考虑取第一项的 a [ 1 , 2 ] a[1,2] a[1,2] 1 , 2 1,2 1,2,第二项 a [ 2 , 3 ] a[2,3] a[2,3] 3 3 3,…以此到最后一项取 a [ n − 2 , n ] a[n-2,n] a[n2,n] n n n。所以从第二项开始每项的第一个元素都多了出来即多了 2 , 3 , 4 , . . . , n − 1 , n 2,3,4,...,n-1,n 2,3,4,...,n1,n,即答案为 a [ 1 , n ] + a [ 2 , n − 1 ] a[1,n]+a[2,n-1] a[1,n]+a[2,n1]
  • 再考虑长度为 3 3 3 a [ 1 , 2 , 3 ] + a [ 2 , 3 , 4 ] + a [ 3 , 4 , 5 ] + . . . + a [ n − 3 , n − 2 , n − 1 ] + a [ n − 2 , n − 1 , n ] a[1,2,3]+a[2,3,4]+a[3,4,5]+...+a[n-3,n-2,n-1]+a[n-2,n-1,n] a[1,2,3]+a[2,3,4]+a[3,4,5]+...+a[n3,n2,n1]+a[n2,n1,n],第一项取 a [ 1 , 2 , 3 ] a[1,2,3] a[1,2,3] 1 , 2 , 3 1,2,3 1,2,3,第二项取 4 4 4,第三项取 5 5 5,…最后一项取 n n n a [ 1 , n ] a[1,n] a[1,n];继续取第二项剩余的 2 , 3 2,3 2,3,第三项的 4 4 4,第四项的 5 5 5,…最后一项的 n − 1 n-1 n1 a [ 2 , n − 1 ] a[2,n-1] a[2,n1],剩余可以取第三项的 3 3 3,第四项的 4 4 4,…倒数第二项的 n − 3 n-3 n3,最后一项的 n − 2 n-2 n2得: a [ 3 , n − 2 ] a[3,n-2] a[3,n2]
    所以得出结论为 w i w_i wi负责 ∑ i = l r a i \sum_{i=l}^{r}a_i i=lrai a [ 1 , n ] + a [ 2 , n − 1 ] + . . . + a [ i , n − ( i − 1 ) ] , i ∈ [ 1 , ⌊ n + 1 2 ⌋ ] a[1,n]+a[2,n-1]+...+a[i,n-(i-1)],i\in[1,\lfloor\frac{n+1}{2}\rfloor] a[1,n]+a[2,n1]+...+a[i,n(i1)],i[1,2n+1]
    对于 i > ⌊ n + 1 2 ⌋ i>\lfloor\frac{n+1}{2}\rfloor i>2n+1
  • 继续考虑长度为 n n n时,只有一个 a [ 1 , n ] a[1,n] a[1,n]
  • 再考虑长度为 n − 1 n-1 n1时,只有 a [ 1 , n − 1 ] + a [ 2 , n ] = a [ 1 , n ] + a [ 2 , n − 1 ] a[1,n-1]+a[2,n]=a[1,n]+a[2,n-1] a[1,n1]+a[2,n]=a[1,n]+a[2,n1]
  • 再考虑长度为 n − 2 n-2 n2时,只有 a [ 1 , n − 2 ] + a [ 2 , n − 1 ] + a [ 3 , n ] = a [ 1 , n ] + a [ 2 , n − 1 ] + a [ 3 , n − 2 ] a[1,n-2]+a[2,n-1]+a[3,n]=a[1,n]+a[2,n-1]+a[3,n-2] a[1,n2]+a[2,n1]+a[3,n]=a[1,n]+a[2,n1]+a[3,n2]
    可以发现长度为 1 1 1和长度为 n n n ∑ i = l r a i \sum_{i=l}^{r}a_i i=lrai一样,长度为 2 2 2和长度为 n − 1 n-1 n1一样,长度为 3 3 3和长度为 n − 2 n-2 n2一样。
    长度为 i i i和长度为 n − ( i − 1 ) n-(i-1) n(i1)一样。

注意: n n n为奇数时,没有和 ⌊ n + 1 2 ⌋ \lfloor\frac{n+1}{2}\rfloor 2n+1 ∑ i = l r a i \sum_{i=l}^{r}a_i i=lrai一样的长度。

代码:

#include
using namespace std;

typedef long long ll;
const int N = 3e5 + 10;
const int mod = 1e9 + 7;
ll all[N], w[N];
int n;
int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%lld", &all[i]), all[i] += all[i - 1];
	for(int i = 1; i <= n; i++) scanf("%lld", &w[i]);
	
	ll temp = 0, res = 0;
	for(int i = 1; i * 2 <= n + 1; i++) {
		(temp += all[n - (i - 1)] - all[i - 1]) %= mod;
		(res += (w[i] + ((i * 2 == n + 1) ? 0 : w[n - (i - 1)])) * temp) %= mod;
	} 
	printf("%lld\n", res);
	
	return 0;
}

你可能感兴趣的:(技巧,思维)