【GFOJ】2018省選訓練12 & 多校聯測

開始了刷題……
T1 題面:給出長度爲 m的上升序列A, 請你求出有多少種1……n的排列, 滿足A是它的一個LIS. (1<=m<=n<=15)
一開始想到過狀壓求LIS過程中的單調棧,然而沒往下想,去手玩推式子了……然而沒推出來……
題解:【狀壓+3進制】
設F【S,S0】,S,S0爲n位二進制,S表示當前已經加了哪些元素,S0表示當前單調棧中的元素,那麼枚舉最後一個加什麼即可。
轉移時類似two_pointer掃一遍即可。
注意到S0一定屬於S,所以直接用三進制壓即可。
有個trick是最後如何統計答案,只要轉移時判一下,如果加的元素i在A中,則必須前一個元素出現過才能轉移,
然後S0中有m個1即可貢獻至答案。
總複雜度是O3NN ,貌似會T,只要加個剪枝:如果當前S0中1的個數>m或者當前F值==0 直接conitnue即可。

T2 題面:給出一個正N邊形以及其三角剖分,邊權爲1,Q組詢問兩點間最短路。
題解:【分治+SPFA】
考慮沿着一條對角線切開多邊形,使得點儘量均勻,顯然較小的一邊至少有[N3] 個點,(證明的話大概是把三角形抽象爲節點,轉化爲一個二叉樹,相當於找一條邊斷開。)然後從對角線的兩點跑最短路,對於跨過對角線的點計算答案,同側的遞歸做下去即可。最後三角形時判一下即可。
不過這題實現起來很CD,調就更CD了……
過程solve()參數有當前頂點,詢問,對角線,然後每次切完都要重新把節點分配,注意要先做右邊,防止左邊做時下標越界到右邊,因爲切完後對角線的點會被算兩次,所以會多出一些點。

T3 題面:給定一個矩陣,權值爲負的話表示一個炮塔,有-1~-4 4個值,代表上下左右四個方向,正的話代表敵人數,每個炮塔可以在攻擊範圍內選一個位置攻擊,貢獻爲敵人數,要求炮彈路線不能相交。
題解:【最小割】
詳見:https://www.cnblogs.com/hongyj/p/8646446.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章