ZOJ 3872 (思想)

ZOJ 3872 (思维)

题意: 

给你一个串,  串和为所有不相同数字之和,  然后让你求该串所有连续子串总和为多少。

题解:

从前往后扫一次   ,  记录当前数字出现次数,  计算和的时候减去该数字乘出现次数

代码:

#include<stdio.h>
#include<iostream>
#include<map>
using namespace std;
map<int, long long int> mark;
int main()
{
   int T, a, n;
   scanf("%d", &T);
   while(T--)
   {
      scanf("%d", &n);
      long long int sum = 0, ans = 0;
      mark.clear();
      for(int i = 1; i <= n; i++)
      {
            scanf("%d", &a);
            ans += (i*a);
            sum += ans; 
            sum -= (mark[a] * a);
            ans -= (mark[a] * a);
            mark[a] = i;    
          
      }          
      printf("%lld\n", sum);
   }    
}