您的位置:首页 > 其它

ZOJ 3872 Beauty of Array

2015-04-29 21:49 483 查看
题目大意:将连续的子序列,这边需要搞懂什么是连续子序列,想了半天,
举一个栗子:2 3 3,他连续子序列是(2),(3),(3),(2,3),(3,3),(2,3,3)。这样子就懂了吧。
beauty summation 指的就是这个序列当中不重复的数的和。
这道题就是要求所有子序列的beauty summation的和。
方法:
从左直接扫。由于是连续,所以这个数除了自己一个之外,都要带上前面的数。或者说这个数一定会跟在他前面数的所有集合当中。
利用这点,可以这么想。设s表示前一个数所有集合的beauty summation。
现在多了一个数k,在k的前一个数与k相等的话,意味着有k出现的元素大于1个的集合,都会出现两个以上的k,这时候新多的这个k就不能贡献自己的作用。
具体看一下公式吧。感觉最近有点着急。。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[1100000];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
long long ans = 0;
int k;
long long s = 0;
memset(num, 0, sizeof num);
for (int i = 1; i <= n; i++)
{
scanf("%d", &k);
s = s + k + (i - 1 - num[k])*k;
num[k] = i;
ans += s;
}
printf("%lld\n", ans);
}
}




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