星星之火OIer 逆序對(樹狀陣列)題解

2021-09-02 13:28:27 字數 2333 閱讀 8326

老實說,還沒有歸併排序快

先上**,再解釋

#include#includeusing namespace std;

inline void read(long long &x)

while(s>='0'&&s<='9')

x*=f;

}inline void pr(long long x)

struct node a[500005];

long long lsh[500005],c[500005],b[500005],n,k,ans;

inline int lowbit(int x)

inline void update(int x,int k)

inline int sum(int x)

inline bool cmp(node a,node b)

說明:i的二進位制可以看做a1b(a是最後乙個1之前的部分,b是最後乙個1之後的0)

i-1的二進位制可以看做a0c(c是和b一樣長的1)

i & (i - 1)的二進位制就是a1b & a0c = a0b

i – (i & (i - 1))的二進位制就是a1b – a0b = 0…010…0

2、求lowbit方法二:原數

為i(十進位制)

,先將原數轉化成二進位制之後,在與原數相反數的二進位制按位與,答案就是

lowbit(i)

的結果;

lowbit(i)

例如:lowbit(22)=2

22的二進位制原碼011010,正數的補碼等於它的原碼011010

-22的二進位制原碼111010,負數的補碼等於它的原碼取反加1,為100110

011010  & 100110 = 000010正數轉換成原碼後依然是000010

所以lowbit(22)=2

根據這個特點

voidupdate(int k,int x)

結合,可以求出c陣列的值。

然後來看如何求字首和:

求字首和b段**(ps:此區間為字首和,也就是1~i)

int sum(int k)

自己結合影象理解

逆序對其實就是求前面有幾個比他大的數,然後把每乙個的和累加起來就好了

**分析:

int main()

for(int i=1; i<=n; i++)

pr(ans);

}

在最後為什麼要用ans+=i-sum(lsh[i])留給大家自己思考

星星之火OIer 星星題解

題目大意 天文學家經常研究星形圖,其中恆星由平面上的點表示,每顆恆星都有笛卡爾座標。讓恆星的水平為不高於恆星的數量,而不是給定恆星的右側。天文學家想知道恆星水平的分布。例如,檢視上圖中顯示的地圖。星號5的等級等於3 它由三顆恆星形成,數字為1,2和4 並且由2和4編號的星的等級是1.在該地圖上,只有...

星星之火OIer 矩形牛棚題解

題目大意 在一塊地板上整齊的鋪滿地磚,但其中有一些有汙跡,現在要求你找出乙個沒有汙跡的最大正方形 以下1代表有汙跡 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 其中最大正方形的邊長為2 狀態轉移方程 dp i j min dp i 1 j mi...

星星之火OIer 快讀 快輸

在這裡給大家介紹一下快讀快輸,自己也存個檔。inline void read int x while s 0 s 9 x f 正數不改變符號 x 1 負數就改變 x 1 此之謂快讀inline void pr int x if x 9 因為putchar一次只能輸出一位,而且要從前往後輸出,所以要用...