NOIP模擬賽2

Helioca發表於2024-03-19

晨光起於白塔頂尖,終將鋪滿陰霾之地。

T1學飛機

少些了一行,掛掉了67分,綁點使我快樂,沒關係,至少有分)。不過這道題目的耗時實在是太久了,有兩個多小時?
題目的意思大概就是我有一個陣列,如果所有陣列裡面的每個數字都能全部大於其中的一個陣列,那麼我每個陣列就能對應的加上一個值,問我最多能加上多少個陣列。

如果陣列中只有一個元素,那麼將值的大小排序就可以了。
但是我們的值有很多個,我們如果只是按照其中的某一值排序的話,我們不能保證其它的值的也滿足這樣的限制條件。

我們思考如果能選擇一個陣列說明了什麼,就是我們比它大的數字加起來一共有多少個,如果有n個的話,那麼就可以了。

所以我們對於每一個陣列同一個位置上面的數字全部排序。
如果我們分別單獨求解,如果剛好每個數字都可以,然後再把價值加進去,如果有一次更新的時候沒有滿足要求的陣列,那麼以後就都沒有了,直接結束就可以了。時間複雜度\(O(nm)\)

T2造飛機

Ca打了一個簡單的差分陣列,拿到了二十出頭的步驟分。
這道題目我卡了很久,最開始完全沒有想到可愛的珂朵莉,更不用說線段樹。為什麼沒有想到可愛的珂朵莉呢)

其實我們不管從哪一天開始都可以把這個變化的過程變成一條線,因為這個東西它有頭有尾,所以可能並不是一條直線,我們思考對於同一個區間的機器而言,他們差的天數其實是有一段連續的是一樣的,為什麼會出現這種情況呢,因為它們相比於上一個機器增加的天數其實都是1。把機器使用完以後,一個機器的使用天數又會變成一個連續上升1的段。我們嘗試用一個數字表示這一段區間的情況。於是我們就固定一個點,假設是從這個節點開始增加的,最好就是我們的1號機器。那麼這個數字就像一條直線所對應的截距一樣,也類似於把這個線段延長出去,到一個固定的點所在的豎線(這個點是多少其實無所謂)。然後我們比較天數(對於相同的區間[l,r])的時候,直接把這個數字相減就可以了。

如果下次讓我做類似的題,我還真不一定想得到,就像上次的李超線段樹)都跟函式的思想或多或少有些關係

T3開飛機

亂打了一個st表,得到了關於是一條線的步驟分。
不得不說,我著實沒想到(好像也沒時間想了)。考試以後重新做也沒想不清楚。其實很簡單

這是一個圖,起點和終點都是0,前進的時候還可以往上面飛。

我沒有想到路勁是高度單調遞增,然後保持不變,高度又單調遞減。我們思考,如果是·上·下·上· 這樣飛行,我們完全可以把它變成·上·上·下,而且一定能保證飛得過去。

我們嘗試,把中間那一段平得部分抬起來。如果路勁是奇數的話,這段路是可以對稱的,否則的話,就會多出來一段平的路。現在問題是,這個路徑如果是奇數,那麼這個尖的點是一定存在的,只是我們不知道它是誰,那麼直接暴力列舉每一個節點,然後更新\(ans = min(max(dis1[x], disn[x]) \times 2)\),那些不滿足的節點,都會被換掉(很好,在這裡我又g掉了,因為不知道怎麼找點,認為多有計算的價值都是存在而且有意義的,這樣的計算可能不能保證對於每一個點都是最優秀的,但是可以保證對於我們要的頂點是最優秀的,而且這個頂點->值->奇數條邊的路徑的貢獻是優秀的。現在可以考慮偶數條邊,相當於有一條平行的邊,那麼就是\(ans = min(ans, max(dis1[x] + disn[y]) \times 2 + 1)\)其中存在\(edge(x, y)\)。這個計算值對於每一個x不一定是最優秀的,但是可以計算到所在路勁的最小的貢獻。我們不知道一條路勁的奇偶性,但是可以把兩者全部都比較一遍求最小。