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就不能贡献自己的作用。
具体看一下公式吧。感觉最近有点着急。。
举一个栗子: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); } }
相关文章推荐
- ZOJ 3872 Beauty of Array
- ZOJ 3872 Beauty of Array( DP思想 )
- ZOJ-3872-Beauty of Array【数学】【12th浙江省赛】
- D - Beauty of Array ZOJ - 3872
- ZOJ 3872 Beauty of Array(数学)
- ZOJ14省赛3872——DP——Beauty of Array
- [dp] zoj 3872 Beauty of Array
- ZOJ_3872_Beauty of Array_计数原理
- ZOJ 3872 Beauty of Array(模拟)
- ZOJ 3870 Team Formation && ZOJ 3872 Beauty of Array
- ZOJ 3872 Beauty of Array (思维 dp思想)
- ZOJ 3872 Beauty of Array(DP)
- ZOJ Problem Set - 3872 Beauty of Array
- ZOJ 3872 — Beauty of Array
- ZOJ 3872 Beauty of Array&&ZOJ 3870 Team Formation
- ZOJ 3872 Beauty of Array DP 15年浙江省赛D题
- ZOJ 3872 Beauty of Array
- D - Beauty of Array ZOJ - 3872
- zoj--3872--Beauty of Array(思维)
- ZOJ 3872 Beauty of Array (The 12th Zhejiang Provincial Collegiate Programming Contest )