Codeforces Round #261 (Div. 2) D 樹狀數組應用
看著題意:[1,i]中等於a[i]的個數要大於[,jn]中等於a[j]的個數 且i
int n;
int aa[1000000 + 55];
int bb[1000000 + 55];
int c[1000000 + 55];
map mp;
ll lowbit(ll x) {
return x&(-x);
}
void add(int i,int val) {
while(i <= n) {
c[i] += val;
i += lowbit(i);
}
}
ll get_sum(int i) {
ll sum = 0;
while(i) {
sum += c[i];
i -= lowbit(i);
}
return sum;
}
void init() {
memset(c,0,sizeof(c));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
mp.clear();
}
int main() {
while(scanf("%d",&n) == 1) {
init();
for(int i=1;i<=n;i++)scanf("%d",&aa[i]);
for(int i=1;i<=n;i++) {
mp[aa[i]]++;
bb[i] = mp[aa[i]];
add(bb[i],1);
}
mp.clear();
ll ans = 0ll;
for(int i=n;i>=1;i--) {
add(bb[i],-1);
mp[aa[i]]++;
int tmp = mp[aa[i]];
ans += i - get_sum(tmp) - 1;
}
cout<