tjut2838
来源:互联网 发布:网络语言我都快长草了 编辑:程序博客网 时间:2024/05/21 01:54
#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define MAX(a,b) (a > b ? a : b)#define MIN(a,b) (a < b ? a : b)#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define lson k<<1, L, mid#define rson k<<1|1, mid+1, Rtypedef long long LL;const double eps = 1e-12;const int MAXN = 100005;const int MAXM = 500005;struct NODE{ int num;//记录个数 __int64 sum;//记录比它小的数的和}c[MAXN];int N;void init(){ mem0(c);}int lowbit(int x){ return x & (-x);}void edit(int k, int num){ while(k <= 100000) { c[k].num += 1; c[k].sum += num; k += lowbit(k); }}int getnum(int k)//得到比当前数小的数的个数{ int num = 0; while(k > 0) { num += c[k].num; k -= lowbit(k); } return num;}__int64 getsum(int k)//得到比当前数小的数的和{ __int64 sum = 0; while(k>0) { sum += c[k].sum; k-=lowbit(k); } return sum;}int main(){ while(~scanf("%d", &N)) { init(); int num; __int64 ans = 0; for(int i=1;i<=N;i++) { scanf("%d", &num); edit(num, num); int cnt = i - getnum(num);//有cnt的数比num大 if(cnt != 0) { ans += (__int64)cnt*num + getsum(100000)-getsum(num); } } printf("%I64d\n", ans); } return 0;}
0 0