點此看題
設現在能表示的區間是[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
(logn
)o(\log n)
o(logn)
資料結構一定選主席樹,時間複雜度o(n
log2n
)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的狀態 其間不斷用區...