NOIP2013題目簡析

2022-06-02 10:27:11 字數 2303 閱讀 4382

t1:轉圈遊戲

可以發現答案為[x+m*(10^k)]%n。

瓶頸在於k最大10^9,用快速冪輕鬆解決。

t2:火柴排隊

容易發現,當最小的ai對應最小的bi,第二小的ai對應第二小的bi,……時兩列火柴之間距離最小。

然後你發現可以乙個序列不動,只移動另乙個序列(兩個序列都移動的最少步數是一樣的)。

然後你發現ai的大小沒有用,只有排序後的編號才有用,b陣列同理。

舉個例子說明吧:

排序後的a陣列編號:2 3 1 5 4

排序後的b陣列編號:1 4 2 5 3

答案就是1 4 2 5 3-->2 3 1 5 4的代價。

把2 3 1 5 4視為1 2 3 4 5,

那麼1 4 2 5 3就是3 5 1 4 2。

也就是3 5 1 4 2-->1 2 3 4 5的代價。

由於1 2 3 4 5沒有逆序對,那麼答案就是3 5 1 4 2的逆序對數(因為你每次調整可以減少乙個逆序對)。

t3:貨車運輸

首先容易發現開車經過的路多不是件好事情。

很多路實際上根本不會走。哪些路會保留呢?

答案:最大生成樹(這題可能是森林)中的邊才會保留。(這一步很機智)

道理很顯然,如果你可以用大的邊走到乙個城市,為什麼要走小的邊呢?

所以你先kruskal跑一遍最大生成樹,這樣圖就變成了一顆樹(或是森林)。

如果詢問的兩個節點不在一棵樹裡,那麼顯然答案是-1。

否則你可以參考倍增lca的做法,仍然用倍增思想,只不過維護的是min值。

這樣這個問題就解決了。

t1:積木大賽

這個問題其實不難。

首先你發現一次操作的區間長度越長越好。

如果a[i]

複雜度o(n)。

t2:花匠

我的做法實現起來很煩,但是思維難度幾乎沒有。

因為有兩種不同的方式,你肯定要分開處理。

只考慮第一種,即2i-1<2i>2i+1的形式,另一種是同理的。

因為你發現實際上是一高一低的過去的,考慮dp,用dp[i][0]表示它作為高的那個最大的擺放數,dp[i][1]表示它作為矮的那個的最大的擺放數。

每個數dp[i][1]=1

dp[i][0]=max(dp[j][1])+1(需要滿足h[j]

dp[i][1]=max(dp[j][0])+1(需要滿足h[j]>h[i])

樸素的轉移是o(n^2)的,所以會t掉。那麼你考慮開一顆線段樹按照h值維護,然後你可以在o(nlogn)的時間內完成dp(其實樹狀陣列也行)。

然後你就可以a掉此題,但**長度2k以及時間都很不理想。

然而實際上你a完之後會很震驚--有比你短得多也快得多的o(n)做法。

首先仍然是兩種情況分別處理,假設處理2i-1<2i>2i+1的形式。

那麼你先假設h[1]是要留下的,然後你需要尋找比它大的數。

如果下乙個數剛好比它大,那麼就把它作為序列下乙個數即可,之後你要尋找比它小的數了(同理進行)。

否則你就把當前這個數給改掉,改成這個比它小的數,以增加尋找比它大的數的可能性。

這樣貪心去做,複雜度o(n),**不到線段樹的一半。

t3:華容道

這道題拿到題,看到n,m<=30,立即想到bfs。

由於有用的位置只有兩個:目標棋子所在位置,空白格仔所在位置,所以狀態數最多n^4個,也就是一次bfs的複雜度。

由於q<=500,然後算了一下複雜度是o(4e8),期望卡卡常數過去,然後t掉了,嘗試了好多次無果。

不得不思考更優的方案了。

可以發現空格移動次數太多而目標棋子移動的步數並不多,這個冗餘可以大量的減掉。

很快想到,你可以用三維狀態i,j,k表示目標棋子在i,j,棋子在其k位置(上下左右)來做(因為不然你目標棋子是動不了的)。

這樣狀態數變為n^2*4個,但是問題是你轉移一步不是o(1)的了,應該是兩次空格位置之間的距離+1(目標棋子與空格交換位置的一步)。

然後你會考慮去大力地跑bfs來計算空格之間距離(什麼floyd,dijkstra,spfa),每個點都去跑一次,o(n^4)預處理出點對兩兩距離。

但是你發現這樣是有漏洞的,因為你在移動空格的時候,可能一不小心根目標棋子交換了,導致這樣的情況出現:空格到了指定位置,目標棋子跑到別的什麼地方去了。

那麼你就需要重新規劃下預處理。

由於i到j的距離與j到i的距離其實是一樣的,你可以對於每個i,j,k狀態都跑一次bfs(注意,中途不能經過i,j點)。

這樣你的預處理仍然是o(n^4)的,但是避免掉了原來的問題。

然後注意你待會不能再寫bfs來轉移三維狀態i,j,k了,而是要寫spfa……

然後你會寫出乙個2.5k左右的**來a掉此題……

NOIP2016題目簡析

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

NOIP2011題目簡析

t1 鋪地毯 由於後面鋪的地毯會覆蓋前面的地毯,所以對於詢問,你可以倒往上搜,一旦發現一張地毯能覆蓋該點,輸出其編號然後break。如果沒有一張地毯能覆蓋該點就輸出 1。t2 選擇客棧 條件是兩個 假設選擇x,y兩個客棧 1 color x color y 2 min p 首先你可以把客棧按照不同顏...

NOIP2013 火柴排隊

題目 分析 a中第幾大一定對應b中第幾大。ab同時移動相當於a移動,相對位置不變。所以,用c i 表示a i 需要移動到的 位置,求其中的逆序對。因為乙個每移動相鄰兩個元素相當於消除乙個逆序對。include include using namespace std const int tmax 10...