每日一道模板題-10/10
阿新 • • 發佈:2018-12-14
題面
給定一個序列
求這個序列中逆序對的個數
要求:必須使用樹狀陣列
分析
雖然就是這麼簡單一個模板,但我還是寫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; }