NOIP2011題目簡析

2022-06-02 10:27:09 字數 2670 閱讀 5437

t1:鋪地毯

由於後面鋪的地毯會覆蓋前面的地毯,所以對於詢問,你可以倒往上搜,一旦發現一張地毯能覆蓋該點,輸出其編號然後break。如果沒有一張地毯能覆蓋該點就輸出-1。

t2:選擇客棧

條件是兩個(假設選擇x,y兩個客棧):

1、color[x]=color[y]

2、min<=p

首先你可以把客棧按照不同顏色分成若干類,並且是有序的(使用vector可以減少記憶體,p黨請無視),這樣第乙個條件已經滿足了。

接下來的操作都是對於同種顏色的客棧而言。

然後你發現,如果確定了開頭,那麼結尾越後,min值<=p的成功概率越大,所以你可以二分答案,確定第乙個滿足條件2的位置,這個位置以後的客棧也一定滿足條件2,就可以直接累加。

確定開頭+二分答案,複雜度已經達到nlogn,如果要驗證是否滿足條件2,可以使用線段樹,複雜度是logn的,這樣總複雜度o(nlognlogn),約為65000000,經過檢驗,這樣會t掉(得益於線段樹的大常數)。

實際上你發現驗證是否滿足條件2是乙個rmq問題,那麼st表o(nlogn)的預處理和o(1)的詢問可以使整個問題的時間複雜度降為o(nlogn),就可以a掉此題了。

t3:mayan遊戲

看到這個題,發現整個圖只有5*7的範圍,n≤5實際上告訴你這道題是搜尋。

那麼,dfs還是bfs呢?這裡考慮採用dfs,因為bfs空間比較耗。

樸素的dfs:

對於乙個狀態的每個方塊,都窮舉其左移或是右移的狀態,得到下一狀態。優先順序按題目給出。

從樸素的dfs開始一步一步優化:

1、死迴圈問題:例如,我們先讓x,y左移一格,沒有方塊消除,接著卻又讓x,y-1右移一格,局勢回到了原來的樣子,從而陷入死迴圈。

你當然可以在下一次dfs之前打個標記,告訴他是從這個方向過來的,如果沒有方塊消除,別走回頭路,但是這個優化顯然不夠強力。

由於題目要求字典序最小,你發現x,y左移一格,與x,y-1右移一格效果是相同的(除非x,y-1上沒有方塊,不能進行操作)。

而後者的字典序比前者小,也就是說,只有左邊格仔上沒有方塊的格仔才能進行左移操作,否則可以用右移代替。

2、什麼樣的情況被判定無解:因為存在橫豎5個同時消除等很多複雜情況,不能單獨從3消來考慮,但如果有一種顏色數目<3,那必定無法消除,判定無解。

3、此外,交換兩個顏色相同的方塊是沒有意義的。

4、可以考慮hash來避免到重複局面。(本人嘗試了好幾個素數做模數,也試了雙重hash,但是連樣例也過不了……)

基本上,你依靠前3條優化dfs已經可以a掉此題了。

t1:計算係數

由於k較小,先花o(k^2)計算出楊輝三角。然後ans=楊輝三角對應項*(a^n)*(b^m),這裡寫了個快速冪,不過不寫也沒事。

t2:聰明的質監員

你很容易發現:區間的價值是隨著w的減小而增大(或不變的),簡單來說,yi具有單調性。利用這個,你可以二分答案。

簡單來說,就是對於二分答案出的w,計算出所有區間的總價值v,然後更新最小值。

若v>s,那麼v增大沒有意義,v需減小,也就是w增大。

若v所以問題變成了,如何快速計算總價值v。

不難發現,計算價值實際上分成兩個獨立的部分,乙個是σ1的部分,另乙個是σvj的部分。

考慮線段樹,你發現它可以維護,但是對於不同的的w,每次需要重新建樹,也就是說,用線段樹每次計算總價值的o(nlogn)的,在乘以二分答案的log,以及線段樹的大常數,這個演算法要t。

實際上這個用字首和思想維護就好了,這裡沒有min或者max之類的不可減的東西,你可以先分別計算σ1和σvj兩部分的字首和,到時候計算每個區間的價值,用(字首和r)-(字首和l-1)的值可以o(1)計算。

t3:觀光公交

很容易想到貪心,但是怎樣貪心才是正確的呢?

你先考慮乙個氮氣加速器都不用的情況,然後你要盡量使每個氮氣加速器的價值充分發揮。

首先,氮氣加速器的使用效果主要與兩個因素有關:

1、人數 

2、每站最晚的人到達時間(由於你必須等待最晚上車的那個人,所以氮氣加速器使用過頭了並不好)。

另外,你在一段路上使用氮氣加速器,影響的人不一定是當前車上的人。

具體一點,假設在x站到x+1站之間的路上使用了氮氣加速器,稱y站為第乙個車到達時間小於最晚上車的人到達時間的站(使用之後的效果)

,則以x+1站~y站為終點的人才能受益,原因在於,以y站以後為終點的人將會因為等待使此次氮氣加速器的作用失效。

你肯定需要快速計算以x+1站~y站為終點的人的個數--字首和可以解決這個問題。

使用乙個氮氣加速器是會影響後面氮氣加速器的使用的。如果你在x站到x+1站之間的路上使用了氮氣加速器,那麼:

1、為了保證此次氮氣加速器的效果始終有效,前面的站可能要減少使用氮氣加速器的上限

2、後面的站會受到否則這次用的可能失效,而後面的位置則直接受這次使用的影響而減少了使用氮氣加速器的上限。

所以簡單地每次使當前氮氣加速器發揮最大價值感覺上不對,然後……思路好像斷了。

但是實際上,這是正確的--氮氣加速器無論放在哪個位置,都會影響所有的位置,而且影響幅度都是一樣的(使用氮氣加速器的上限-1,除非本來已經不能使用了),所以你每次貪最大的就好了。

這樣,你可以得到乙個o(kn)的演算法,也就是對於每個氮氣加速器,你都貪心令其發揮最大價值(具體實現可以先對於每個x算出y,然後再取最大值,注意最後的更新),看上去要t。但是你可以發現乙個小優化:如果乙個氮氣加速器最大貢獻已經為0,後面的氮氣加速器的最大貢獻一定也為0,可以直接退出迴圈。於是,這個問題就解決了。

NOIP2016題目簡析

t1 玩具謎題 直接模擬即可,對於每次操作直接計算出下一位置,時間複雜度o m t2 天天愛跑步 乙個簡單的做法 你可以預處理計算出所有si和ti的lca,然後對於每個觀察員,判斷它是否在si到ti的道路上,如果是計算出到達它的時間,如果與其觀察時間相符,則其能觀察人數 1。但時間複雜度o nm 要...

NOIP2013題目簡析

t1 轉圈遊戲 可以發現答案為 x m 10 k n。瓶頸在於k最大10 9,用快速冪輕鬆解決。t2 火柴排隊 容易發現,當最小的ai對應最小的bi,第二小的ai對應第二小的bi,時兩列火柴之間距離最小。然後你發現可以乙個序列不動,只移動另乙個序列 兩個序列都移動的最少步數是一樣的 然後你發現ai的...

NOIP2011 觀光公交

題目 分析 設last i 表示來到第i個景點的乘客最晚的時間,time i 表示車到達第i個景點的最小時間。因為每個乘客到達的時間已經固定,所以要使總時間最小,就是使 time down i 最小,其中down i 代表每位乘客的目的地。先考慮不用加速器的情況。可以直接遞推求出答案,time i ...