您的位置:首页 > 其它

[dp] zoj 3872 Beauty of Array

2017-04-09 10:36 375 查看
题意:

给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]。

代码:

[cpp] view plain copy print?



#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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: