题意:
给n个数,求连续子序列的和。子序列内的相同元素只计算一次。
思路:
举例 2 3 3.
i=1
2
i=2
2 3
3
i=3
2 3 3
3 3
3
i=1的时候和是2,i=2的时候和是2+3+3=8,i=3的时候和是2+3+3+3=11
其实我们只要考虑当前的a[i]被用了多少次就好了。
那么我们用used[j]记录j前一次出现的位置。
那么当前的a[i]用的次数便是i-used[a[i]]次,所增加的和就是(i-used[a[i]])*a[i]。
代码:
- #include”cstdlib”
- #include”cstdio”
- #include”cstring”
- #include”cmath”
- #include”queue”
- #include”algorithm”
- #include”iostream”
- #include”map”
- #include”stack”
- #include”vector”
- #define ll long long
- using namespace std;
- int used[123456];
- int main()
- {
- int t;
- cin>>t;
- while(t–)
- {
- int n;
- ll ans=0,sum=0;
- scanf(”%d”,&n);
- memset(used,0,sizeof(used));
- for(int i=1;i<=n;i++)
- {
- int x;
- scanf(”%d”,&x);
- sum+=(i-used[x])*x;
- ans+=sum;
- used[x]=i;
- }
- printf(”%lld\n”,ans);
- }
- return 0;
- }