World is Exploding
.
.
解法:先求出所有Aa
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct Node{
int id, val;
bool operator>(Node &t) {
return val>t.val;
}
bool operator<(Node &t) {
return val<t.val;
}
};
const int maxn = 60000;
long long fb[maxn], fs[maxn], bb[maxn], bs[maxn], f[maxn], b[maxn];
Node a[maxn];
int n;
void insertb(int x) {
while (1) {
f[x] = f[x]+1;
if (x <= 1) break;
x = x-(x & (-x));
}
}
int findb(int x) {
int count = 0;
while (1) {
count = count+f[x];
x = x+(x & (-x));
if (x > n) break;
}
return count;
}
void inserts(int x) {
while (1) {
f[x] = f[x]+1;
x = x+(x & (-x));
if (x > n) break;
}
}
int finds(int x) {
int count = 0;
while (1) {
count = count+f[x];
if (x <= 1) break;
x = x-(x & (-x));
}
return count;
}
int main() {
int tt;
while ((scanf("%d", &n)) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i].val);
a[i].id = i;
}
sort(a+1, a+1+n);
int count = 1;
b[a[1].id] = 1;
for (int i = 2; i <= n; i++) {
if (a[i].val != a[i-1].val) count++;
b[a[i].id] = count;
}
memset(fb, 0, sizeof(fb));
memset(fs, 0, sizeof(fs));
memset(bb, 0, sizeof(bb));
memset(bs, 0, sizeof(bs));
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++) {
insertb(b[i]);
fb[i] = findb(b[i]+1);
}
memset(f, 0, sizeof(f));
for (int i = n; i >= 1; i--) {
insertb(b[i]);
bb[i] = findb(b[i]+1);
}
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++) {
inserts(b[i]);
fs[i] = finds(b[i]-1);
}
memset(f, 0, sizeof(f));
for (int i = n; i >= 1; i--) {
inserts(b[i]);
bs[i] = finds(b[i]-1);
}
long long ans = 0, /*bb*/temp1 = 0, /*bs*/temp2 = 0;
for (int i = 1; i <= n; i++) {
temp1 += bb[i];
temp2 += bs[i];
}
ans = temp1*temp2;
for (int i = 1; i <= n; i++) {
ans = ans-(fs[i]*bs[i]);
ans = ans-(bb[i]*bs[i]);
ans = ans-(fs[i]*fb[i]);
ans = ans-(fb[i]*bb[i]);
}
printf("%lld\n", ans);
}
}