蒜頭君的排序(樹狀陣列維護逆序對)

2021-08-09 23:31:59 字數 1411 閱讀 5227

蒜頭君是乙個愛思考的好孩子,這一天他學習了氣泡排序,於是他就想,把乙個亂序排列通過氣泡排序排至公升序需要多少次交換,這當然難不倒他,於是他想來點刺激的,給定乙個 1 \ldots n

1…n 的排列,每次從該排列中選擇乙個區間 [l,r]

[l,r

],問使用氣泡排序將該區間排至公升序需要多少次交換操作。

第一行乙個整數 n

n,表示排列長度。

接下來一行 n

n 個整數,表示該排列。

接下來一行乙個整數 m

m,表示詢問次數。

接下來 m

m 行,每行 2

2 個整數 l,r

l,r,表示詢問 [l,r]

[l,r

] 區間。

輸出 m

m 行,每行 1

1 個整數,第 i

i 行表示第 i

i 個詢問的答案。

對於 30

30% 的資料,滿足 1 \le n,m \le 300

1≤n,m≤

300;

對於 60

60% 的資料,滿足 1 \le n,m \le 1000

1≤n,m≤

1000

;對於 100

100% 的資料,滿足 1 \le n,m \le 30000,

1≤n,m≤

3000

0, ll

\sum | l[i]-l[i-1] |\ +

∑∣l[i]

−l[i

−1]∣

+\sum | r[i]-r[i-1] | \le

∑∣r[i]

−r[i

−1]∣

≤ 7 \times 10^6

7×10​6

​​。樣例輸入10

9 8 7 4 5 6 10 3 2 1

52 4

8 10

2 85 9

4 9

樣例輸出

3313

79

題目**

2017

noip 提高組模擬賽(一)day2

#include#include#include#includeusing namespace std;

int n,m,a[100100],l,r,c[100100],ll=1,lr=0,ans;

int low(int x)

void add(int x,int val)}

int ask(int x)return cnt;}

int main()

while(lll)

printf("%d\n",ans);

} return 0;

}

蒜頭君的排序

蒜頭君的排序 蒜頭君是乙個愛思考的好孩子,這一天他學習了氣泡排序,於是他就想,把乙個亂序排列通過氣泡排序排至公升序需要多少次交換,這當然難不倒他,於是他想來點刺激的,給定乙個 1 ldots n1 n 的排列,每次從該排列中選擇乙個區間 l,r l,r 問使用氣泡排序將該區間排至公升序需要多少次交換...

蒜頭君的排序

蒜頭君是乙個愛思考的好孩子,這一天他學習了氣泡排序,於是他就想,把乙個亂序排列通過氣泡排序排至公升序需要多少次交換,這當然難不倒他,於是他想來點刺激的,給定乙個 1 ldots n1 n 的排列,每次從該排列中選擇乙個區間 l,r l,r 問使用氣泡排序將該區間排至公升序需要多少次交換操作。第一行乙...

樹狀陣列 求逆序對 排序

首先需要了解逆序對是什麼 逆序對就是如果i j a i a j 這兩個就算一對逆序對。其實也就是對於每個數而言,找找排在其前面有多少個比自己大的數。那麼思路就來了,樹狀陣列又一次地優化了這種 需要遍歷 的情況。那不就很容易了嗎?依次把序列裡的數放到樹狀陣列中的a i 上去 實際是以c i 形式的插入...