NOIP 2015 簡要題解

2021-07-07 01:44:16 字數 3116 閱讀 2109

最終還是打了個漂亮的醬油

[day 1]

t1 神奇的幻方

送分模擬題,但是遇到了乙個非常流弊的學弟:

/*************************************以上純屬娛樂 割********************************************/

t2 資訊傳遞

大意:在乙個只有n條有向邊的圖中,每個結點出度為1,求乙個包含節點數最少的環。

分析:因為只有n條邊並且每個點都有且僅有一條邊連出去,所以只可能存在簡單環,不會出現那種8字形的環套環。

證明:每個點有兩種情況:1.不在任何乙個環中 這樣的點可以直接忽略掉,看成是有n-1個點,n-1條邊來證明就行了。2.在某個環中。那麼如果我們現在有了乙個圈圈形狀的環,大小為k,那麼每乙個點都應該入度出度都為1,這樣的環只存在乙個迴路,也就是乙個簡單環,如果存在多個迴路,那麼應該存在某個點的入度》1,但是又要保證別的點出度至少為1,所以出度之和應該是》k的,但入度之和=k,無法滿足,所以不存在某個環存在兩條或以上數量的迴路。證畢。

滿足了這樣的性質,tarjan或者o(n)掃瞄都是可以解決本題的。

t3 鬥地主

與一些hn、zj的選手在網上討論,覺得這道題目作為第三題,沒有體現出應有的價值,只是讓很多人在這上面花費了大量時間而已,並且首先題目描述有不清晰之處,而且資料純隨機也讓人很不是滋味,畢竟也許有的人用搜尋剪枝碰巧能拿高分甚至ac,而那些寫的很好的標準演算法卻被卡掉,oi畢竟不是運氣的較量,而是實力的爭奪。

因為之前模擬賽的時候寫過一次狀壓dp爆空間,然後這道題空間1g太過耀眼,再加上np問題複雜的狀態以及相對略小的資料範圍,在考場上就朝著狀壓dp的方向思考,首先對於每一副手牌,我們預處理出每一種可能的出牌方式,然後丟進乙個陣列裡,在dp的時候,記錄乙個cnt表示當前是第幾次出牌,用bool[i](i是二進位制數)表示出cnt次牌時,狀態i是否能實現,然後只要某一次滿足2^m-1也就是所有牌全出掉的情況可以實現時就退出,此時的cnt就是最少出牌次數。

具體時間複雜度根據每副牌而有很大差異,但是應該過60%的資料是沒有問題的。

賽後補:拿到程式以後再寫了寫,狀壓dp

確實是能過

60%的點,但是想

ac的話還是要用到

dfs+

狀壓dp

或者直接a*。

[day 2]

t1 跳石頭

看到最大值最小或者最小值最大之類的問題,很容易想到是二分答案,

具體說明:假設我們已經知道答案是k,也就是滿足最小的距離最大為k,那麼最終搬走石頭以後任意兩個石頭之間的距離都是大於等於k的,那麼我們只要檢驗是否能搬走m塊石頭使得滿足k就可以了。

首先,題目告訴我們,起點石頭也就是0是固定的,然後如果我們搬走乙個石頭i的話,如果左邊的石頭已經滿足答案k,那麼移除i對答案是沒有影響的,因為到左邊石頭的距離只會變大,不可能小於k。

對於當前的石頭i,下一塊石頭為j,pre[i]為i上一塊石頭,sub[j]為j下一塊石頭

有兩種可能:

1.i到j的距離小於等於k,也就是不滿足答案,那麼我們要做的是,移除j。

因為i到pre[i]是》=k的,那麼j到pre[i]一定也》=k,但是i都不一定滿足i到sub[j]的距離》=k,更不談離sub[j]更近的j了,所以為了之後的石頭考慮,我們需要移除j。

2.i到j的距離大於k,也就是i,j之間已經符合條件了,那麼就可以什麼都不動了。

因為i到j的距離已經大於k了,所以對於j之後每一塊石頭,都是滿足條件的,所以i對檢驗答案並沒有什麼影響了,那j如何考慮呢?j之後就會成了下乙個i,再如上文分兩種情況處理了。

所以具體就是二分答案k,然後o(n)檢驗,總複雜度o(nlogl)。

ps:有一種特殊情況需要考慮,也就是n可以等於0,這時候答案直接就是l,但是處理方法很簡單,二分的時候要將上界設為l,這樣就不會有什麼影響了。

t2 子串

大意:求將b串選出k段,順次拼起來能構成a串的方案數。

本題的階段非常鮮明,f[i][j][t]表示a,b分別匹配到i,j位時,已經用到了b的第t個子串的方案數,另外match[i][j]表示a,b分別匹配到i,j位時,最多可以向前匹配多少位,如a=cabab,b=cab,那麼match[5][3]=2,match可以暴力預處理出來。

考慮第i位不匹配和最多向前匹配match[i][j]位的情況,由此得出轉移方程:

但是很明顯這樣的複雜度在最壞情況下是o(n*m^2*k),所以我們要考慮優化。

首先是空間上:n*m*k可以達到4kw,明顯不夠用,然後我們發現,選到第t個子串的方案數隻和選到t-1個子串的方案數有關,所以我們考慮以時間換空間,用滾動陣列,f[0]和f[1]兩個二維陣列交替使用,解決空間問題。

然後是時間上:觀察這個轉移方程,實際上是乙個求和,那麼具體是什麼呢?我們如果把f[i][j]看成乙個二維矩陣,那麼實際上就是求的以i-1,j-1(因為每個子串不能為空所以至少要選乙個)為右下角,i-match[i][j],j-match[i][j]為左上角的的正方形的主對角線上的元素之和,所以對於這種求和,我們可以考慮用類似字首和的方法o(1)轉移,另開陣列g[i][j]表示以i,j為右下角的整條斜線上元素之和,那麼轉移方程就更新為:

這樣就降掉了乙個o(m)的時間,但是因為使用滾動陣列而且常數有點大,所以在實際列舉的時候再注意一些小優化剔除一些不必要的狀態。

t3 運輸計畫

在考場上並沒有做出來,敲了個50的樸素,後來請教了一下wzy和zk,太厲害了。

大體框架就是二分答案然後用lca來檢驗。

但是有幾個注意點:

1.二分的時候wzy是直接二分路徑總長度,zk是二分的選取的作為蟲洞的邊的長度,這樣就差距了約乙個log級別的複雜度,但對實際效果是一樣的,這點值得吸取教訓。

2.求lca的時候如果用普通的倍增會掛掉,要用tarjan離線求lca。

3.還未解決的內容:我們在做路徑處理的時候可以用一些特殊的技巧,給每乙個點乙個權值,在lca的時候順帶處理一下,然後就可以得到每一條邊被多少條路徑覆蓋了,方便之後檢驗答案。

NOIP2015子串題解

題目描述 有兩個僅包含小寫英文本母的字串a和b。現在要從字串a中取出k個 互不重疊 的非空子串,然後把這k個子串按照其在字串a中出現的順序 依次連線 起來得到乙個新的字串,請問有多少種方案可以使得這個新串與字串b相等?注意 子串取出的位置不同也認為是不同的方案。輸入第一行是三個正整數n,m,k,分別...

題解 Noip2015 資訊傳遞

有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號 為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同 時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資訊,但...

題解 NOIP 2015 子串

淦!這題我做了三個月啊 有兩個僅包含小寫英文本母的字串 a 和 b 現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 現的順序依次連線起來得到乙個新的字串。請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出的位置不同也認為是不同的方案。第一行是三...