思路見注釋,套兩個模板就好,沒什麼技巧
//理解了快速排序的時間複雜度 不難發現這道題是乙個
//純樹狀陣列 + 逆序對 直接套模板就好了
//樹狀陣列每個結點存放的是小於等於該結點的value
//逆序對公式:逆序對=大於該value的個數
//因為樹狀陣列的n取決於序列的最大值
//所以套個離散化模板就好了
//離散化模板為不重複模板
//lowbit的含義是計算二進位制數中從右數第乙個1的位置
//例如6(0110)->2
#include#include#include#include#define lowbit(x) (x&(-x))
using namespace std;
const int maxn=5e5+10;
struct node p[maxn];
int n,bit[maxn],a[maxn];
bool cmp(const node& a,const node& b)
return ans;
}int main(void)
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
a[p[i].pos]=i;
long long ans=0;
memset(bit,0,sizeof(int)*(n+5));
for(int i=1;i<=n;i++)
cout<}
return 0;
}
POJ 2299(樹狀陣列,離散化)
題意 求逆序數 題解 可以將數字插入樹狀陣列,每次統計比單前數字小的個數,我們將每個數字的權值設定為1,那麼只要求在他前面數字的和就知道了,對應的逆序數格個數是i sum a i 這裡使用樹狀 陣列維護區間和 這一題由於數字範圍過大,記憶體無法承受如此大的空間,我們可以看到n最多才5e5,所以最多有...
poj 2299 樹狀陣列 離散化
樹狀陣列求逆序數 離散化 求逆序數時,加入當前數字,然後統計大於當前數字的數字個數,題目資料很大,需先將其離散化。include include include define n 500005 define lowbit x x x using namespace std int c n a n s...
POJ 2299 樹狀陣列,離散化
題目大意 求一組數的逆序數有多少個 題目解析 用樹狀陣列做,向下更新,向上求和,因為資料範圍太大,但是每個數都不一樣所以先離散化一下 ac include include include include includeusing namespace std typedef long long ll ...