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





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