1. 程式人生 > >Codeforces1066(Div3)Part.1

Codeforces1066(Div3)Part.1

我發現我的水平根本不高,有些想法和思路則根本沒有

就連第一道水題都有些吃力,所以這次我要收集一下Codeforces的Div3的題目,全部都做一遍

 

這裡選擇的是最近的codeforces 1066 上的題目

 

第一題

1066 A

 

1-L長度,每隔v個位置有一個標誌,在l-r之間看不到標誌;

計算你能看到的標誌;

基本上就是一個數學問題,然而我在l-r上區間磨蹭了半天

 

現在總結一下就是,L/v是總標誌個數

 

還要計算看不到的標誌個數,用l-r的區間不好計算,我們用1-r減去1-l-1的標誌個數就ok了

也就是r/v-l/v

****l-1是計算l左側的區間,如果要計算l-r不能包括l

 

1066B

 

這道題是一道貪心的題目,我還沒有解決,回頭單獨列出來

 

1066C

這道題目講的是一個書架L,R不斷插入書

然後找書時輸出該書左側書的數目和右側書的數目中的min

 

關鍵如何查詢用線性查詢必定超時,所以必須要去用資料去維護ta

看到別人的blog中講述到的維護數值,將查詢時間降到O(1),真的覺得別人好聰明,我大概是個傻子

 

維護方式是這樣的:

首先將L和R的下標取一個較大的數值,同時去維護ta,l=R-1;(左右要相鄰)

當你左側插入式,將某書id標記為L,同時L--(維護左側下標,L,R都為側邊沒有書的編號)

同理,右側Id標記為R,R++;

這時候每個數目都有一個Id,因為沒有刪除的操作,所以是一個靜態,Id一旦標記,不需要更改,下標只需要維護最側下標即可

 

輸出時,將某ID的標記位置與最左側下標和最右側下標進行相減,(別忘了-1,因為L,R的位置並沒有書)

最後輸出小的那個值