您的位置:首页 > 其它

[dp] zoj 3872 Beauty of Array

2015-04-27 20:47 405 查看
题意:

给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 long
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: