ZOJ 3872 Beauty of Array

题目大意:将连续的子序列,这边需要搞懂什么是连续子序列,想了半天,
举一个栗子: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);
	}
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章