题意:求一个序列中没有重复元素的子序列的和为多少
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5520
思路:容斥求每个值的贡献,用map记录最接近的相同值的位置,通过容斥推出的公式计算每个值的贡献
注意点:无
以下为AC代码:
Run ID | Submit Time | Judge Status | Problem ID | Language | Run Time(ms) | Run Memory(KB) | User Name |
3944942 | 2015-04-26 18:16:31 | Accepted | 3872 | C++0x | 340 | 1052 | luminus |
/*
***********************************************
*# @Author : Luminous11 (573728051@qq.com)
*# @Date : 2015-04-26 17:34:22
*# @Link : http://blog.csdn.net/luminous11
***********************************************
*/
#include <bits/stdc++.h>
#define clr(a, v) memset( a , v , sizeof(a) )
using namespace std;
const double eps = 1e-10;
const double pi = acos(-1.0);
long long num[100005];
map<int,int>mp;
int main()
{
//ios::sync_with_stdio ( false );
int T;
scanf ( "%d", &T );
while ( T -- ){
int n;
scanf ( "%d", &n );
long long ans = 0;
mp.clear();
for ( int i = 1; i <= n; i ++ ){
scanf ( "%d", &num[i] );
ans += ( num[i] * ( i - mp[num[i]] ) * ( n - i + 1 ) );
mp[num[i]] = i;
}
printf ( "%lld\n", ans );
}
return 0;
}