蒜頭君的排序

2022-05-11 01:10:41 字數 1572 閱讀 8826

蒜頭君的排序

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

第一行乙個整數 nn,表示排列長度。

接下來一行 nn 個整數,表示該排列。

接下來一行乙個整數 mm,表示詢問次數。

接下來 mm 行,每行 22 個整數 l,rl,r,表示詢問 [l,r][l,r] 區間。

輸出 mm 行,每行 11 個整數,第 ii 行表示第 ii 個詢問的答案。

對於 3030% 的資料,滿足 1 \le n,m \le 3001≤n,m≤300;

對於 6060% 的資料,滿足 1 \le n,m \le 10001≤n,m≤1000;

對於 100100% 的資料,滿足 1 \le n,m \le 30000,1≤n,m≤30000, ll樣例輸入

10

9 8 7 4 5 6 10 3 2 1

52 4

8 10

2 85 9

4 9

樣例輸出

3313

79

題解:

這道題要用莫隊演算法,首先將左端點分塊,對於每一塊都按右端點從小到大排序。然後維護乙個樹狀陣列維護當前區間內比i小的數的個數,特別注意一下臨界條件。每次維護一下答案即可。

#include#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

lol;

lol n,m,a[

30001],lim,c[30001],cnt[30001

];struct

node

s[30001

];lol gi()

while(i>='

0'&&i<='9')

return ans*f;

}bool cmp(const node a,const

node b)

lol lowbit(lol x)

void

add(lol x,lol v)

lol getsum(lol x)

intmain()

sort(s+1,s+m+1

,cmp);

lol left=1,right=0,ans=0

;

for(i=1;i<=m;i++)

while(left>s[i].l)

while(right>s[i].r)//

while(right1);ans+=getsum(n)-getsum(a[right]);}//

cnt[s[i].id]=ans;

}for(i=1;i<=m;i++)

return0;

}

蒜頭君的排序

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

蒜頭君面試

題目 問題描述 蒜頭君來蒜廠面試的時候,曾經遇到這樣乙個面試題 給定 n 個整數,求裡面出現次數最多的數,如果有多個重複出現的數,求出值最大的乙個。當時可算是給蒜頭君難住了。現在蒜頭君來考考你。輸入格式 第一行輸入乙個整數n 1 n 100000 接下來一行輸入n個 int 範圍內的整數。輸出格式 ...

蒜頭君下棋

蒜頭君下棋 共一行,兩個整數nn和mm 1 leq n m leq 10001 n,m 1000 代表棋盤一共有 nn 行 mm 列。輸出乙個整數,代表棋盤上最多能放的馬的數量。樣例輸入1複製 2 4樣例輸出1複製 4樣例輸入2複製 3 4樣例輸出2複製 6 1 當棋盤只有一行時,棋盤上全放上棋子即...