[HDU 5086] Revenge of Segment Tree (前缀和)

来源:互联网 发布:彩虹代刷网源码 编辑:程序博客网 时间:2024/05/15 02:21

链接

HDU 5086


题意

给出一段序列,求所有连续区间和。


题解

求两次前缀和sum[], sum2[],答案就是total[sum[i]*i - sum2[i-1]]。

代码

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;typedef long long lint;const lint mod = 1000000007;#define maxn (447777)int a[maxn];lint sum[maxn], sum2[maxn];int main(){    int T;    cin >> T;    while(T--)    {        int N;        cin >> N;        for(int i = 0; i <= N; i++)            sum[i] = sum2[i] = d[i] = 0;        for(int i = 1; i <= N; i++)            scanf("%d", &a[i]);        sum[1] = a[1];        for(int i = 2; i <= N; i++)        {            sum[i] += a[i] + sum[i-1];            sum[i] %= mod;        }        sum2[1] = sum[1];        for(int i = 2; i <= N; i++)        {            sum2[i] += sum[i] + sum2[i-1];            sum2[i] %= mod;        }        lint o = a[1];        for(int i = 2; i <= N; i++)        {            o += ((sum[i] * i) % mod + mod - sum2[i-1]) % mod;            o %= mod;        }        cout << o << endl;    }    return 0;}
0 0
原创粉丝点击