Exam20240629 賽後結

haozexu發表於2024-07-09

Exam20240629 賽後結

T1

想法幾乎是對的,結果兩個不能直接乘起來

就是如果你不太冷靜的話就容易做出錯誤的判斷,我考慮了這個問題,居然認為直接乘起來是可以的emm

T2

不太熟悉容斥,想到字首和之後扔了

結果它這個時候就已經變成 slime和npc 了

這個時候就只需要欽定一段是大於 k 的其他直接組合數填就 OK 了

其實考的時候想到了這樣做,但是由於害怕自己不熟悉容斥棄掉了,比較可惜,其實肯定是可以做的。

所以重算一下,理想應該能夠拿到 260pts,這個還是相當高了,還是要對自己有信心,同時增強熟練程度

T3

搞了奇怪方法,好像複雜度卡成 \(\mathcal O(nq)\) 了,直接拿到 60,不知道怎麼搞得。但是向這個方向想是肯定不行的,其實這個第一個性質當時我想到了,可是沒有重視,下次應該記得都寫出來(主要是時間不足了,打暴力花了很多時間,馬力還要練)

剩下的還是比較有思維難度

看懂了,發現這個性質之後,就可以考慮增量構造答案,這個改掉一段就相當於刪掉連續段,這個是和我那個暴力是相同的,這也說明了那個做法就是 \(\mathcal O(nq)\) ,兩個相同的大元素刪除中間的一段”小“元素(此處大元素就是可以戰勝小元素的),這個很像括號匹配,可以用棧維護,發現最後的棧底就是答案。

不過這樣還是 \(\mathcal O(nq)\) ,但是我們發現,這個彈棧的操作,要麼:

  • 彈 0 個加 1 個(當且僅當會被棧頂打敗)+1

  • 彈 2 個加 1 個(當且僅當可以打敗棧頂且棧大小大於1)-1

  • 彈 1 個加 1 個(當且僅當可以戰勝棧裡的唯一元素或者和棧頂打平)0

要找的棧底,就是最後一個替換掉棧底的元素,即最後執行戰勝棧裡唯一元素的那個

此時棧大小從 1 還是變為 1,換言之最後一個棧大小為 1 的地方就是答案

所以可以考慮線段樹,只需要維護最右邊最左邊元素是誰和最右邊那個地方的棧大小,然後維護最小值和最小值的位置