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
原创粉丝点击