NOIP2018停課訓練1
day1
40+35+20
d1t1
給出一個n*m的網格圖,有n個給定點在網格圖的交點上,要求從(0,0)出發到(n,m),求離給定點的最小距離的最大值。
n<=2000
題解:
最小生成樹。
兩兩給定點連邊,並且向上下左右分別連邊。
不能到達的情況為:
1、上下聯通
2、左右聯通
3、上左聯通
4、下右聯通
d1t2
給出一棵樹和一條非樹邊,求圖的最短路徑的最大值。
n<=1e6
題解:
重邊情況,選較小的一條變成樹,求直徑。
自環情況顯然不會走自環,求直徑。
其他情況非樹邊會構成一個環,那麼就是一個環套樹。
把環找一個點斷開並倍長序列,對於環上點掛著的樹求最遠點,那麼答案可能為:
1、某棵樹的直徑
2、某兩棵子樹的最遠點形成的路徑。
用資料結構可以做到O(nlogn),單調佇列可以優化一個log
d1t3
給出一棵樹,每條邊有一個通過的時間,要求從1進入樹並且至少經過所有節點一次後從1出來。
當你在一個節點時,可以進行兩種不消耗任何時間的操作:
1、放置一個1號傳送門,並撤銷上一個1號傳送門
2、放置一個2號傳送門,並撤銷上一個2號傳送門
3、如果放置了1號傳送門並且有2號傳送門,傳送到2號傳送門所在節點
4、如果放置了2號傳送門並且有1號傳送門,傳送到1號傳送門所在節點
求完成遍歷的最小時間。
n<=1e6
題解:
傳送門肯定是後代往祖先上跳更優,並且對於一棵子樹,如果根節點上有傳送門,我們可以最後遍歷子樹最遠點並跳回來。
考慮dp,設f[i][0]表示在i點不使用傳送門,f[i][1]表示使用
對於所有son[i],我們可以在i點使用傳送門,而選擇從son[i]的最遠點處跳回,或者在son[i]使用,i點不使用。
day2
90+0+40
d2t1
給出0~n個位置,初始在0,有k種跳躍方式形如(ai,wi),即使用wi的時間跳ai步。
如果你上次使用了第i種跳躍方式,下一次將使用第j種(i<>j),那麼需要額外的v時間來轉換(第一次選擇跳躍方式不需要時間)。
有些限制形如(xi,yi),表示不能使用第yi種方式經過位置xi。
求0~n的最小時間。
n<=500,k<=100
題解:
考慮dp,設f[i][j],表示跳到第i個位置,最後使用的是第j種跳躍方式的最小時間。
每次列舉上一個使用的是哪種跳躍方式轉移就好了。
d2t2
給出一棵樹,每個點上有點權,有q個指令:
1、詢問,給出ki個點,詢問這些點中任意兩點路徑上所有的點的和
2、修改,改變一個節點的權值
n,q<=1e5,Σk<=1e6
題解:
對於每個詢問,如何做到不重不漏?
我們可以考慮把詢問點按dfs序排序,這樣前i個點的lca的dfs序會越來越小。
列舉詢問點,每次加入當前詢問點到之前所有詢問點的lca上的值
那麼變化一下,就變成了每個點到根的和-相鄰兩點的lca到根的距離+所有點lca的父親到根的距離。
詢問可以用樹鏈剖分+線段樹解決,修改也就變得簡單了。
d2t3
給出一個n個點m條邊的帶權圖,每次詢問兩點之間不經過重複點的路徑的最大值。
還有修改操作,修改一個點的點權。
n,m,q<=1e5
題解:
構出圓方樹,每個點雙中的點向方點連邊,每個方點的權值定為點雙中的最小點。
但是這樣的話,如果是菊花圖。那麼修改根節點就會修改所有點雙。
那麼我們改變一下點雙的意義,不維護環頭,那麼修改變成O(2)的啦。
每個方點弄一個可以維護最小值並且支援插入刪除的東西,multiset很ok。