ybt金牌導航6 1 1 第 k 小數

2021-10-19 22:58:29 字數 1125 閱讀 5306

求序列中第 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 的質因子...