nowcoder 2020 牛牛的湊數遊戲

2021-10-25 01:59:49 字數 1530 閱讀 1547

點此看題

設現在能表示的區間是[1,

r]

[1,r]

[1,r

],如果新加入了乙個數b

bb,那麼新產生的區間是[b,

r+b]

[b,r+b]

[b,r+b

],如果r+1

<

br+1r+

1<

b就可以直接不算了,因為後面的數不會下降,而空出來的r+1

r+1r+

1是永遠無法填補的,否則我們把r

rr擴大b

bb。現在想必你知道為什麼區間只會有一段。

我們模擬上的的過程,最多拿到40

4040

分,我們考慮用資料結構加速我們的遍歷,我們稱上一次遍歷的r

rr是lst

lstls

t,那麼[ls

t+1,

r+1]

[lst+1,r+1]

[lst+1

,r+1

]中間的數算出來加上去,如果沒有數的話就跳出。這樣的複雜度怎麼保證?我們以lst

lstls

t為參考係,那麼花了2

22步就翻倍啦!這樣遍歷的次數一定是o

(log⁡n

)o(\log n)

o(logn)

資料結構一定選主席樹,時間複雜度o(n

log⁡2n

)o(n\log^2n)

o(nlog2n

),還有一些細節看**

#include

const

int m =

100005

;const

int up =

1e9;

#define int long long

intread()

int n,m,cnt,rt[m]

,ls[

40*m]

,rs[

40*m]

,sum[

40*m]

;void

insert

(int

&x,int y,

int l,

int r,

int id)

intask

(int x,

int l,

int r,

int l,

int r)

signed

main()

for(

int i=

1;i<=m;i++

) lt=mx+

1;mx+

=t;}

if(f==0)

printf

("%lld\n"

,mx+1+

ask(rt[r],1

,up,lt+

1,up)

-ask

(rt[l-1]

,1,up,lt+

1,up));

//說明mx超過了上界,但還是要統計遺留的部分

}}

nowcoder 2020 襪子分配

點此看題 期望有一種暴力計算方法,就是總和 總情況數,總情況數是 2n 2n 2n 的,考慮總和即可。考慮每一對襪子的貢獻,可以發現無論是第幾次選取情況數是2 2 n 2 2 2n 2 2 2n 2 也就是我們強制這對襪子被選取,注意要考慮先後順序 那麼一共有n nn次,n nn雙襪子,所以是2n2...

nowcoder 2020 牛半仙的妹子數

點此看題 考試時候先打了個表,首先我們可以確定a b ca b c a b c是乙個定值,一開始我想去維護a aa和b bb然後去算c cc,但是這樣會很難算,a aa和b bb的變化是極不規律的,我們不妨去研究ccc 在重複一遍,p a b c p a b c p a b c是定值,打表如下 資料...

牛牛的木板 牛牛的字元反轉

原題鏈結 題意 一段長n的序列,由0 1組成。可把m個0改1,求序列中最大連續1的個數。思路 尺取法 雙指標法 設定一對指標l,r。最開始都指向第乙個元素。l,r是區間左右端點,r指標先不斷往右遍歷,當區間內0的個數超過m時,l指標向右遍歷,要跳過乙個0,維持乙個區間內改了m個0的狀態 其間不斷用區...