老實說,還沒有歸併排序快
先上**,再解釋
#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一次只能輸出一位,而且要從前往後輸出,所以要用...