求序列中第 k 小的數。
不能 nlogn 做。
這道題可以用分治來做,分治有點二分的味道。
它每次選乙個數列中的數,然後把比它大的放在前面,比它小的放在後面,然後它放在中間。(這個你可以搞兩個指標來搞,每次找到兩邊然後 swap)
那它的位置就是它的排名(你也只確定了它的,但是夠了),然後如果排名就是你要的,就直接記錄,退出。
如果排名小了,說明數應該大點,那就處理右邊的區間。
如果排名大了,說明數應該小點,那就處理左邊的區間。
然後就可以了。
#include
#include
#define ll long long
using
namespace std;
ll n, a[
5000001
], k, ans;
ll read()
return re;
}void
work
(ll l, ll r, ll k)
ll l = l -
1, r = r +1;
ll val = a[
(l + r)
>>1]
;while
(l < r)
if(r - l +
1>= k)
work
(l, r, k)
;//排名大了,要數小點
else
work
(r +
1, r, k -
(r - l +1)
);//排名小了,要數大點
}int
main()
stl 自帶函式。
stl!!!
永遠的神!!!
#include
#include
#define ll long long
using
namespace std;
ll n, a[
5000001
], k;
ll read()
return re;
}int
main()
ybt金牌導航1 2 4 免費餡餅
有乙個直線,在某乙個時刻有乙個餡餅會出現在一些位置,有它的價值。乙個人一開始可以站在直線的任意地方,然後他每個時刻可以不移動,或向任意一邊移動乙個單位或兩個單位。要你求這個人最多能拿多少價值的餡餅。我們看到這道題,弄出最普通的 dp。f i 為對於前 i 個餡餅,接住了第 i 個的最大貢獻。那就是列...
ybt金牌導航1 1 2 乘坐電梯
有乙個電梯,有 n 個人要進電梯。對於每一秒,排在最前面的人有 p 的機率會進電梯 不會再出來 否則不進,別的人都不進。問你 t 秒後,在電梯上的人的期望數量。這道題我們先設 fi,jf fi,j 為在第 i ii 秒之後有 j jj 個人在電梯上的概率。那首先初始化很顯然,f0,0 1f 1 f0...
ybt金牌導航8 6 5 最小原根
給出乙個質數 p pp,找他最小的原根。不知道原根的可以看這個 點我 至於找原根,其實我們可以用乙個近似暴力的方法找。為什麼可以呢,因為它原根分布廣,而且最小的也比較小。我們就考慮判斷乙個數是否是原根。對於要檢查 g gg 是不是模 p pp 的原根,我們可以列舉 p varphi p p 的質因子...