ZOJ 3872 — Beauty of Array

来源:互联网 发布:域名如何解析到ip端口 编辑:程序博客网 时间:2024/06/07 06:42

原题:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3872

题意:求n个数的所有相邻的子数组的和,但重复的数字不加;

    譬如:2 3 3 — 相邻子数组:2;3;3;23;33;233;

    sum = (2)+(3)+(3)+(2+3)+(3)+(2+3)=  21;


思路:a[i]表示到第i个数的所有相邻子数组的和,a[n]即为我们所求的答案;

    b[i]表示加上第i个数之后新增的数组的和;

    num[x]用来记录数字x的位置;


#include<stdio.h>#include<string.h>const int N = 1000005;long long a[N], b[N];long long num[N];int main(){int cas;scanf("%d", &cas);while(cas--){memset(num, 0, sizeof(num));int n;scanf("%d", &n);a[0] = 0;b[0] = 0;for(long long i = 1;i<=n;i++){long long x;scanf("%lld", &x);b[i] = b[i-1]+(i-num[x])*x;a[i] = a[i-1]+b[i];num[x] = i;}printf("%lld\n", a[n]);}return 0;}


0 0
原创粉丝点击