题意:给定一个含有N个数的序列S,定义序列的魅力值为序列中不同数字之和,求出该序列所有子序列的魅力值之和。

分析:每个数乘以它出现的次数,求和即可。

如何求每个数出现的次数?

1、对于一个各数字完全不同的序列,

eg:3 5 2 6 8

对于5来说,确定其存在于的子序列

(1)其右面,可选0个数字---5

        可选1个数字---3 5

(2)其右面,可选0个数字---5

        可选1个数字---5 2

        可选2个数字---5 2 6

            可选3个数字---5 2 6 8

因此,2 * 4 = 8,则5存在于8种子序列中。

2、若序列中出现了重复数字,那么左边直接处理到该重复数字之前出现的位置后即可。

eg:2 3 3 2

对于第二个3,在计算其存在于的子序列时,只需要考虑3(第二个3) 和 3 2 两个子序列即可。

原因:2 3 3 2的子序列有

2

3

2 3

3

3 3

2 3 3

2

3 2

3 3 2

2 3 3 2

我现在只要把这些各序列中不同的数字相加即可。

从左往右开始考虑,2存在于4个子序列中,所以将这4个子序列中的2先加起来,还剩下

2

3

2 3

3

3 3

2 3 3

2

3 2

3 3 2

2 3 3 2

同理,3(序列中第一个3)存在于6个子序列中,还剩下

2

3

2 3

3

3 3

2 3 3

2

3 2

3 3 2

2 3 3 2

现在,来考虑第2个3,按照“若序列中出现了重复数字,那么左边直接处理到该重复数字之前出现的位置后即可”,只需划掉3 和3 2两个序列中的3,还剩下

2

3

2 3

3

3 3

2 3 3

2

3 2

3 3 2

2 3 3 2

最后,划掉最后一个2存在的序列中的这个2,剩下

2

3

2 3

3

3 3

2 3 3

2

3 2

3 3 2

2 3 3 2

其实,求的就是这些划掉数字的和,因为序列中重复的数字不需要研究呀。

因此,对于序列中出现的第二个3,他出现的序列范围为啥不是从最左面开始选数字,而是从该数字最后一次出现的位置后选数字,

因为,从最后一次出现的位置前开始选数字,因为那个之前出现过的数字所包含于的序列,已经把那个之前出现过的数字加上了,没必要再加这个数字了,

eg:

这一段,这第二个3如果从最后一次出现的位置前开始选数字,假设从最左面取吧,那形成的序列是2 3 3,在研究第一个3时,该序列已经加过一个3了,(答案只需要该序列中加一个3就行呀)不需要再加第2个3了,所以没必要从最后一次出现的位置前选数字。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){if(fabs(a - b) < eps) return 0;return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 1000000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int last[MAXN];
int main(){int T;scanf("%d", &T);while(T--){int n, x;scanf("%d", &n);memset(last, -1, sizeof last);LL ans = 0;for(int i = 0; i < n; ++i){scanf("%d", &x);ans += x * LL(i - last[x]) * (n - i);last[x] = i;}printf("%lld\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/tyty-Somnuspoppy/p/6783586.html

ZOJ - 3872 Beauty of Array相关推荐

  1. ZOJ 3872 Beauty of Array (The 12th Zhejiang Provincial Collegiate Programming Contest )

    [题目链接]click here~~ [题目大意]定义Beauty数是一个序列里所有不相同的数的和,求一个序列所有字序列的Beauty和 1 <= N <= 100000 [解题思路]由于 ...

  2. 【ZOJ - 3872】Beauty of Array(思维,计算贡献,枚举)

    题干: Edward has an array A with N integers. He defines the beauty of an array as the summation of all ...

  3. js获取服务器响应头信息,js获取HTTP的请求头信息

    [IIS]IIS扫盲(二) iis - IIS之Web服务器建立 第一篇 IIS之Web服务器  一.建立第一个Web站点  比如本机的IP地址为192.168.0.1,自己的网页放在D:\Wy目录下 ...

  4. c语言产生32位随机数,C语言,如何产生随机数

    1. 基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand (unsigned int n); rand()函数和srand()函数被声明在头文件stdl ...

  5. 老男孩上海校区Python面试题

    python面试题 第一章:python基础 数据类型: 1 字典: 1.1 现有字典 dict={'a':24,'g':52,'i':12,'k':33}请按字典中的 value 值进行排序? 1. ...

  6. 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

    题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1] ...

  7. 【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty

    传送门 这些天风也温柔,题也温柔 开车啦! 文章目录 A1:Add on a Tree 题意翻译 题解 证明 代码实现 B:Count Pairs 题意翻译 题解 代码实现 C:Array Beaut ...

  8. 【CF1189F】Array Beauty【dp】【复杂度玄学优化】

    传送门 题意:给一个长度为NNN的序列aaa,从中选出kkk个,定义一个序列的美丽度为最接近的两个数的差的绝对值,求所有方案的美丽度之和模998244353998244353998244353. N≤ ...

  9. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

最新文章

  1. 工作小记(三)----说说北京生活的乐趣
  2. 1.SQL数据定义语言(基础)
  3. docker可以把应用及其相关的_Docker相关命令应用
  4. 软件工程导论第六周作业:关于servlet,jquery,ExtJs,Spket
  5. AjaxPro怎么用
  6. Swift傻傻分不清楚系列(十)枚举
  7. JAVA四种基本排序总结
  8. 关于E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决
  9. 将文本写在图片上,自定义字体,自动换行,自定义行间距
  10. [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)
  11. 五笔输入法的学习记录
  12. vb语言和python语言_用VB“写”Python程序
  13. 世界经典反编译工具reflector下载
  14. 匹配滤波器的MATLAB实现
  15. 关于flash跨域问题
  16. 指南针c语言程序,HMC5883L电子指南针单片机程序
  17. 如何使用PM2 部署 nodejs 项目
  18. Win32DiskImager写入U盘容量变小 提示格式化
  19. 人脸检测——UnitBox
  20. uniapp 之 禁用手机物理返回键

热门文章

  1. 测试u盘信息软件,U盘检测器
  2. 百度地图 js 在安卓端手指缩放无效_利用百度地图绘制3D轨迹演示
  3. 剑指Offer #10 矩形覆盖(问题分析)
  4. 天津大学计算机考研真题,天津大学计算机科学与技术考研真题
  5. 考研计算机385分什么水平,机械专硕初试385分 给学弟学妹分享一下准备的过程(数学二)...
  6. 当容器应用越发广泛,我们又该如何监测容器?
  7. 应用系统瓶颈排查和分析的思考-Arthas 实战
  8. 开始报名!首次阿里巴巴经济体双 11 云原生实践展示
  9. java classes.jar_classes.jar
  10. springboot 获取配置文件中的值_Spring Boot面试必问(亲测)