2023年8月18日訓練日記

2021-08-07 03:16:01 字數 1683 閱讀 8984

今天一直再看樹狀陣列的內容,感覺還是需要進一步掌握,明天上午再抓緊看一看。感覺樹狀陣列的很多題目都可以說是難度偏大了,樹狀陣列無非是利用它快速的修改元素值和字首和的效率,關於樹狀陣列無非就是那幾個函式,但是首先他有幾種用法,而且與題目的結合使他在題幹中模板性很弱,在題目中看到區間與和的字眼就要聯想樹狀陣列,總之抓緊多看點部落格,這種吸取知識的過程其實也不錯。明天下午就是比賽了,希望有個好的發揮。

樹狀陣列經常會將乙個陣列離散化,這裡說兩種離散化的方法:

1.用一層迴圈將a陣列離散化為b陣列,就是將a陣列從小到大依次放入b陣列對應的位置

for(i=1;i<=n;i++)

sort(a+1,a+n+1);

b[a[1].id]=1;

for(i=2;i<=n;i++)

或者更直接

for(i=1;i<=n;i++)

sort(a+1,a+n+1);

for(i=1;i<=n;i++)

b[a[i].id]=i;

for(i=1;i<=n;i++)

sort(a+1,a+n+1);

b[a[1].id]=1;

for(i=2;i<=n;i++)

if(a[i].val==a[i-1].val) b[a[i].val]=b[a[i-1].val];

else b[a[i].id]=i;

還有

struct node  

node[m];

bool cmp1(node a,node b)

sort(b+1,b+n+1);

for(i=1;i<=n;i++)

離散化後的陣列與原陣列對應的大小關係不變,注意離散化後的陣列用於存入樹狀陣列,但原本的a陣列並不是失去作用,有時還是要用到。

樹狀陣列的一些簡單應用:

1.求陣列中某個元素(i)左邊比他小的元素的個數(cnt[i])

for(i=1;i<=n;i++)

2.求陣列的逆序數(cnt)

for(i=1;i<=n;i++)

由這兩段**可以發現,有時候我們的樹狀陣列中並沒有用來存放真正的數值,原本陣列中元素的值只是變成了樹狀陣列中的下標,所以如果元素太大,樹狀陣列開不了那麼大,而元素的個數本身又沒有那麼多,就有了離散化的方法。

樹狀陣列還有一種用法:把乙個區間內的所有元素都加上乙個值,查詢某乙個元素的值(區間更新,單點查詢)。我們把支援這種操作的樹狀陣列稱為樹狀陣列的模式二,在這種模式下,a[i]已經不再表示真實的值了,是用來輔助的陣列。這時我們真正需要的是另乙個假想的陣列b,b[i] 才表示真實的元素值,也就是sum(i)。

比如現在我要對圖1 中a陣列中紅色區域的值全部1。當然你可以用add(i)對該區間內的每乙個元素都修改一次,但如果這個區間很大,那麼每次修改的複雜度就高了。此時只要將該區域的第乙個元素+1,最後乙個元素的下一位置-1,對每個位置getsum(i)以後的值見下圖:

陣列b,也就是sum(i)正是我們想要的結果,這種方式不適用與求區間和

2023年8月18日訓練日記

cf 考慮乙個問題的多種情況時,一定要按一定順序來 最好在紙上寫出來 不然很容易漏情況。最後半小時不能慌,如果最後半小時還沒思路就可以考慮去hack了。牛客 昨晚的wannafly挑戰賽22用到了乙個裴蜀定理 我不知道這是啥,我只記得離散課上講過結論 b題是有限狀態自動機 什麼鬼 看到紅名大佬用的是...

2023年8月2日訓練日記

今天訓練的主要目的是做完剩下的幾道比較麻煩的搜尋題。其中冰壺 數獨和網路破壞者是dfs,糖果玉公尺孩子是bfs 雖然沒有a掉,但是正在尋找原因,而且絕對是bfs 這些題目都不是前兩天的單純的套搜尋的模板,均是在搜尋的基礎框架上加一些其他的條件以及其他的變化來求得結果。在經過前兩天的水題訓練後,我已經...

2023年8月3日訓練日記

今天訓練的主要目的是a掉搜尋練習中糖果玉公尺孩子,看一些圖論的相關知識。糖果玉公尺孩子中要分三種路線 靠左走 靠右走 最短步數 求最短步數用bfs很容易就能解決,但是一直靠左走和靠右走就比較麻煩,因為走每一步,它的方向都有可能改變,下一步方向的優先順序也會改變。我用了3種辦法,全是mle,無奈之下只...