[dp] zoj 3872 Beauty of Array

来源:互联网 发布:手机网页游戏平台源码 编辑:程序博客网 时间:2024/06/16 18:51

题意:

给n个数,求连续子序列的和。子序列内的相同元素只计算一次。

思路:

举例 2 3 3.

i=1

2

i=2

2 3

3

i=3

2 3 3

3 3

3

i=1的时候和是2,i=2的时候和是2+3+3=8,i=3的时候和是2+3+3+3=11

其实我们只要考虑当前的a[i]被用了多少次就好了。

那么我们用used[j]记录j前一次出现的位置。

那么当前的a[i]用的次数便是i-used[a[i]]次,所增加的和就是(i-used[a[i]])*a[i]。

代码:

#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"#include"map"#include"stack"#include"vector"#define ll long longusing namespace std;int used[123456];int main(){    int t;    cin>>t;    while(t--)    {        int n;        ll ans=0,sum=0;        scanf("%d",&n);        memset(used,0,sizeof(used));        for(int i=1;i<=n;i++)        {            int x;            scanf("%d",&x);            sum+=(i-used[x])*x;            ans+=sum;            used[x]=i;        }        printf("%lld\n",ans);    }    return 0;}


 

0 0
原创粉丝点击