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...