1. 程式人生 > >每日一道模板題-10/10

每日一道模板題-10/10

題面

給定一個序列

求這個序列中逆序對的個數

要求:必須使用樹狀陣列

分析

雖然就是這麼簡單一個模板,但我還是寫WA了

為什麼呢????(不服氣╭(╯^╰)╮)

因為啊要先插入,再查詢,要清楚現在查詢的是小於等於當前數的個數(包括了自己,所以要把自己加進去,才能減掉自己)

程式碼

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int lowbits(int x){
	return x&(-x);
}
ll tr[100009];
int n,a;
void insert(ll x){
	while(x<=100009){
		tr[x]++;
		x+=lowbits(x);
	}
}
int ask(int x){
	ll res=0;
	while(x){
		res+=tr[x];
		x-=lowbits(x);
	}
	return res;
}
int main(){
	memset(tr,0,sizeof(tr));
	scanf("%d",&n);
	int i,j,k;
	ll sum=0;
	for(i=1;i<=n;++i){
		scanf("%d",&a);insert(a);//先插入後查詢 
		sum+=i-ask(a);
	}	
	cout<<sum;
	return 0;
}