蒜頭君的排序
蒜頭君是乙個愛思考的好孩子,這一天他學習了氣泡排序,於是他就想,把乙個亂序排列通過氣泡排序排至公升序需要多少次交換,這當然難不倒他,於是他想來點刺激的,給定乙個 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樣例輸入
109 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 當棋盤只有一行時,棋盤上全放上棋子即...