#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <list>
#define INF 0x3f3f3f
#define maxn 100000 + 50
#define juzheng 300
#define ll long long
using namespace std;
//Date:2017-9-3
//Author:HarryBlackCat
ll arr[maxn],num_tree[maxn],val_tree[maxn],n;
void init(){
memset(arr,0,sizeof(arr));
memset(num_tree,0,sizeof(num_tree));
memset(val_tree,0,sizeof(val_tree));
}
ll lowbit(ll x){
return x & (-x);
}
ll get_num_sum(ll index){
ll ans = 0;
for(ll i = index;i > 0;i -= lowbit(i))
ans += num_tree[i];
return ans;
}
ll get_val_sum(ll index){
ll ans = 0;
for(ll i = index;i > 0;i -= lowbit(i))
ans += val_tree[i];
return ans;
}
void add(ll index,ll val){
for(ll i = index;i <= n;i += lowbit(i)){
num_tree[i] += 1;
val_tree[i] += val;
}
}
int main(){
while(cin >> n){
ll sum = 0;
ll ans = 0;
for(int i = 1;i <= n;i++){
cin >> arr[i];
add(arr[i],arr[i]);
sum += arr[i];
ans += arr[i] * (i - get_num_sum(arr[i])); //arr[i] * 在arr[i]前比arr[i]大的数
ans += sum - get_val_sum(arr[i]);//比arr[i]大的数的总和
}
cout << ans << endl;
}
return 0;
}
HDU 2838 Cow Sorting(树状数组-水题)
最新推荐文章于 2020-08-11 08:53:56 发布