zoj3872——Beauty of Array(数学)
2016-04-06 19:26
330 查看
Edward has an array A with N integers. He defines the beauty of an array as the summation of all distinct integers in the array. Now Edward wants to know the summation
of the beauty of all contiguous subarray of the array A.
The first line contains an integer N (1 <= N <= 100000), which indicates the size of the array. The next line contains N positive integers separated by
spaces. Every integer is no larger than 1000000.
dp[i]=dp[i-1]+a*(i-pre[a]);
求相邻数组的总和,其中数组中不能有重复的数字。设dp[i]为长度为i的数组的总和,用pre[a]记录数字a最后出现的位置,以1,2,3,2为例
i=1,a=1
dp[i]=1;
i=2,a=2
dp[i]=2+(1+2);
i=3,a=3
dp[i]=3+(2+3)+(1+2+3);
i=4,a=2,pre[2]=2
dp[i]=2+(3+2)+(2+3+{2})+(1+2+3+{2});
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000010
using namespace std;
long long pre[MAXN],dp[MAXN],sum;
int main()
{
int t,n,i,a;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(pre,0,sizeof(pre));
dp[0]=0;
for(i=1;i<=n;++i)
{
cin>>a;
dp[i]=dp[i-1]+a*(i-pre[a]);
pre[a]=i;
}
sum=0;
for(i=1;i<=n;++i)
sum+=dp[i];
cout<<sum<<endl;
}
return 0;
}
of the beauty of all contiguous subarray of the array A.
Input
There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:The first line contains an integer N (1 <= N <= 100000), which indicates the size of the array. The next line contains N positive integers separated by
spaces. Every integer is no larger than 1000000.
Output
For each case, print the answer in one line.Sample Input
3 5 1 2 3 4 5 3 2 3 3 4 2 3 3 2
Sample Output
105 21 38
dp[i]=dp[i-1]+a*(i-pre[a]);
求相邻数组的总和,其中数组中不能有重复的数字。设dp[i]为长度为i的数组的总和,用pre[a]记录数字a最后出现的位置,以1,2,3,2为例
i=1,a=1
dp[i]=1;
i=2,a=2
dp[i]=2+(1+2);
i=3,a=3
dp[i]=3+(2+3)+(1+2+3);
i=4,a=2,pre[2]=2
dp[i]=2+(3+2)+(2+3+{2})+(1+2+3+{2});
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000010
using namespace std;
long long pre[MAXN],dp[MAXN],sum;
int main()
{
int t,n,i,a;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(pre,0,sizeof(pre));
dp[0]=0;
for(i=1;i<=n;++i)
{
cin>>a;
dp[i]=dp[i-1]+a*(i-pre[a]);
pre[a]=i;
}
sum=0;
for(i=1;i<=n;++i)
sum+=dp[i];
cout<<sum<<endl;
}
return 0;
}
相关文章推荐
- 利用libvirt给虚拟机添加virtio磁盘驱动
- 两个路由器下电脑如何实现访问
- RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
- C语言入门基础篇,内存与变量关系
- 面向对象设计中SOLID原则
- 安卓之父安迪·鲁宾:让乔布斯羡慕嫉妒恨的人
- 无顺序约束的字符串匹配问题
- leetcode——28—— Implement strStr()
- 我有过一段婚史,你介意吗
- RabbitMQ消息队列(三):任务分发机制
- 4个费劲心思却走向编程地狱的陷阱
- UVA10878 - Decode the tape
- maven 笔记
- 苹果双系统安装教程,苹果笔记本如何装Win7(经典)
- mysql Field xxx doesn't have a default value STRICT_TRANS_TABLES(存储引擎启用严格模式,非法数据值被拒绝)
- 团队开发
- BZOJ2959: 长跑
- 数据结构学习(一)
- arm-linux内存管理学习笔记(2)-内核临时页表的建立
- 1022_哈夫曼树与译码