1 条题解
-
0
没见过比这还短的绿……
思路
一个数可以造成多少贡献?首先对于一个,我们只统计其中每一个数第一次出现。举个例子:对于这样的数列,我们只统计第位,也就是第一次出现。
这样一来,一个数的贡献就是它距离这一个数上一次出现的位置的值乘上它向右的距离,一个数最后一次出现我们用一个map记录,因此一个数的贡献就是$$(i-m[x])*(n-i+1)$$
这样我们就可以写出来巨短无比的代码AC代码
#include<bits/stdc++.h> #define int long long using namespace std; map<int,int>m; signed main() { int n;scanf("%lld",&n); int ans=0; for(int i=1,x;i<=n;i++) { scanf("%d",&x); ans+=(i-m[x])*(n-i+1); m[x]=i; } printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 7954
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 13
- 已通过
- 5
- 上传者