1. 程式人生 > >聯賽集訓考題總結

聯賽集訓考題總結

10.8 xzy

T1

構造七合一.這個先不寫了,構造基本上沒怎麼涉獵.很多題現在還不會.先挖坑,不知道還有沒有機會來填了.

T2

一個長為n的序列,你有m次機會可以選擇n-1個元素減一,或者直接全部-1,問最多可以操作多少次讓序列沒有一個元素小於0.
這個很像是俄羅斯方塊,相當於一般的俄羅斯方塊,每消一行,可以選擇一列+1,這樣你可以把m也看成第n+1個元素,如果是選擇前者的消法,m會消耗1,如果是後者,就等價於選擇了第n+1列+1.這樣就可以二分答案了,二分這個最多次數x,則最下面x行都必須是滿的,於是補齊這x行,看看補齊的代價是不是小於x,如果小於說明合法,否則不合法

T3

空間複雜度...大模擬,比時間複雜度不知道毒瘤多少...收貨主要就是鍛鍊了自己的程式碼能力,思路的條理邏輯性.

10.9 the_despair_ ljq

T1

好題,有很多種方法,倍增floyd,分數規劃都可以.寫了題解

T2

用map優化連邊,直接建圖直接跑DAG最短路即可.

T3

好題,倍增直接寫是\(O(nlogn)\)的,樹的直徑+st表,可以把詢問複雜度降到線性.把直徑摳出來,利用任意一點在樹上的最遠點一定是直徑的某個端點的性質.

10.10 Tyher

T1

套路題,求乘積最短路,直接對每一條邊取log跑普通最短路就可以了.

T2

插頭dp/狀壓dp,不會插頭dp,於是寫了狀壓,細節很多很多.主要的技巧是縮減狀態,把格子黑白染色分塊,黑白不相互影響,轉移的時候判斷合不合法就可以了.考場上想了好久好久網路流,下次看到n*m圖m很小就要注意應該是插頭dp或者狀壓.

T3

gcd和與或運算最多隻有log種取值,於是就可以直接序列分治,考慮怎麼統計覆蓋中點的區間,記錄一個往右的字首和和往左的字首和,把gcd相同的和或起來相同縮成一塊,注意最多隻有log塊,然後暴力列舉兩邊,複雜度\(O(玄學)\)這個複雜度怎麼算啊...

10.11 zkj小胖

T1

毒瘤四合一.
sub1 dp/尤拉路.dp設狀態\(dp[i][j][a][b]\)表示i到j這一段序列的煙霞的最大答案,左端點為a色,右端點為b色.列舉一個\(k\in (i,j]\),考慮合併答案.分為三種轉移.一種是不拿其中一個區間的煙霞,一種是把兩個區間接起來,一種是接起來之後再翻轉過來.由於顏色數很少,就對顏色建圖,一朵煙霞看做一條邊,然後要使邊權和最大,由於邊很多,所以優化連邊,對每一對顏色之間所有的邊,最大值連邊,次大一條邊,剩餘的所有看做一條邊.最後直接dfs找最大和就好了.理論複雜度很高,實際很快.
sub2 結論題,\(ans=\sum w\)

,遞迴證明,一定存在兩個聯通塊之間是用最短邊相連的,因此為了答案最大化我們只走最短邊一次,然後再分別考慮兩個聯通塊,對於每個聯通塊又一定會要經過其最短邊一次,也就是說,我們一定會將最短邊,次短邊,等全部經過一次,所以只需要將所有煙火的美麗值之和相加即可。
sub3 dp,還沒寫,挖墳
sub4 費用流/並查集(類kruskal),參見棋盤上的守衛.一個太陽相當於一條邊,我們要找到一個基環森林,使得每個月亮的出度都是1,權值最大.這樣弄一個tag標記聯通塊裡有沒有環.

T2

毒瘤二合一
sub1式子是\(ans=\sum_{d|n}\frac{n}{d}*\varphi(d)\),這樣由於你可以先對n質因數分解,由於d是n的約數,所以d的質因子一定是n的質因子,考慮我們為什麼要\(\sqrt d\)\(\varphi\)因為,我們要列舉約數,質因子最多隻有log個,預處理質因子,就可以直接通過質因子和類似線性求\(\varphi\),即\(phi[prime[j]]=phi[i]*prime[j]\)的方法了.複雜度\(\sqrt nlog_2n\),實測非常快,但複雜度是錯的.題解也有十分複雜的方法.不想推導了.
sub2 考慮按位操作,統計每一位的1的個數.分類討論,被減數當前位分別是0/1時,減數的範圍,直接把每個字首和丟到樹狀數組裡,區間查詢就可以了.

T3

點分治,小胖資料隨機,好多人都暴力水過去了...考慮這題怎麼做,統計樹上的路徑點權和為k的倍數的方案數,k只有30,可以離線做.點分治對每一棵子樹dp轉移即可,由於是一個一個點往裡新增,所以dp的轉移是\(O(k)\)的.

10.12 fdf

T1

還不會.挖坑.

T2

如果對子樹按\(\frac{sum_i}{size_i}\)從小到大排序,考慮交換兩個子樹的代價\(sum_jsize_i-sum_isize_j\),由於\(\frac{sum_i}{size_i}\leq\frac{sum_j}{size_j}\),則\(sum_isize_j-sum_jsize_i\leq0\)所以直接排序即可.

T3

注意到第一問的答案只有可能是2或者3(至於為什麼...我也不知道...).不管怎樣都至少有一棵樹只需要斷掉一條邊.求出另一棵樹的所以邊在這棵樹的lca,考慮樹上差分維護每一條鏈上經過的路徑數,然後統計答案即可.完全忘記樹上差分這個套路...求lca一定要tarjan(卡時),順帶複習了tarjan求lca.

10.15 YL

T1

感覺現在又稀裡糊塗了...坑(好多坑...)

T2

Trie樹啟發式合併,考慮把邊從小到大排序,每次當前邊都會把兩個聯通塊聯通,貢獻等於這兩個聯通塊裡異或值大於當前邊的點對數,這個可以直接用trie樹統計一下就可以了.合併要把小的聯通塊合併到大的裡面去.

T3

多源最短路+kruskal最小生成樹+貨車運輸

10.16 DAY1

T1

meet in the middle,考場寫的列舉子集可以過,但是兩個陣列混用了,然後就為組拖後腿了...

T2

DP,考慮把1到n的順序排列交換為它給你的序列,每個數原始都在和它數值相等下標下,要移動到目標,設為pos[i],那麼從i到pos[i]這一段的所以交換,都必須i到posjixu順序進行,假設pos[i]在i的右邊,那麼在i的左邊的數要和i這個位置的數交換,必須發生在i和i+1交換之後,那麼就出現了一些制約關係,我們可以通過這些制約關係來dp,dp[i][j]表示操作序列前i個數中,第i個數是第j小的的.如果是右邊先轉,則只能從右邊(>j)轉移而來,如果是左邊先轉,則從左邊(< j)轉移,否則就從任意位置轉移,這個可以字首和優化.

T3

直接二分答案,暴力check,加一句if(!check(ans))continue;即可ac.

10.17 DAY2

T1

簡單貪心,被我寫成線段樹優化連邊最大流...還寫掛...直接先按左端點排序,考慮從左到右加點,找區間匹配,每次左端點合法的加入堆中,堆維護右端點最小.

T2

神仙dp,題目就是有標號樹的形態計數,狀態是\(dp[i][j]\)表示節點個數為\(i\),最大深度不超過\(j\)的方案數.如果無標號考慮合併兩棵樹,最大深度不超過\(j\)的狀態,一棵節點數為k,一棵為i-k,那麼其中一棵的深度必須是\(j-1\),接到一棵深度為\(j\)的樹上,如果有標號,要乘上一個組合數\(C(i-2,k-1)\),意為兩棵樹分配標號.統計答案恰好等於就是不超過n減去不超過n-1的.

T3

很容易發現聯通塊個數就是點數減去邊數,給定區間\([l,r]\),點數已知了,那麼只要檢查連邊,而連邊只會範圍內的點之間產生,把u到v的邊抽象成平面上一個點,很經典的二維數點問題,樹狀陣列或者主席樹做就好了.

10.18 DAY3(zsy)

毒瘤QAQ

T1

求三位偏序,資料範圍\(2*10^6\),顯然不能直接cdq(之前三維偏序都是寫的cdq套cdq,導致今天根本沒法卡常qaq).那麼考慮容斥.對於一對需要算到答案裡的點,它一定會被統計到下面的所有三個sigma中;對於一對不需要算到答案裡的點,它也一定只會在下面的sigma中被計算一次(有且僅有一對大小關係是相同的,如果\(a_1,a_2\)的大小關係不同於\(b_1,b_2\),則\(c_1,c_2\)的大小關係一定同於其中一個,反之,如果\(a_1,a_2\)的大小關係同於\(b_1,b_2\),則\(c_1,c_2\)的大小關係一定不同於其中任何一個),那麼答案就會等於如下式子:
\[(\sum[a[i]<a[j]][b[i]<b[j]]+\sum[a[i]<a[j]][c[i]<c[j]]+\\sum[b[i]<b[j]][c[i]<c[j]]-\frac{n(n-1)}{2})/2\]
cdq可以求出每一個位置的偏序個數,而這種方法不行.

T2

不會,,,

T3

不會...

10.19 FLASH

今天的題感覺出得很好哇.

T1

一個類似斜率優化的東西,事實上就是要找到對於一對\(A,B\).要求使\(\frac{A}{a_i}+\frac{B}{b_i}\)最大的i.不妨把每個a,b抽象成平面直角座標系上的點,把限制抽象成一個不等式的影象,不難發現這個不等式影象的邊界的斜率一定是小於0的,於是要求在邊界的點,其實就是要找一個凸殼,我們在化簡式子的時候會發現要將一個正負性不確定的數同時在不等式兩邊相乘,這樣就變成要維護兩個凸包.分類討論很麻煩,於是可以先按照a排序,在維護斜率遞增的左下凸包就可以了.(卡精度啊QAQ)

T2

高斯消元的原創題.flash真的很愛化學呢...高斯消元沒學透,這道題消元要注意的主要是,對於每個變數,當你找不到方程這一位上有係數的時候,跳下一個變數,方程的指標暫時不動,這樣一直把所以的變數消掉就可以了.(-0.0 QAQ)

T3

這題覆蓋面很廣,很好的練習題啊.倍增+二分答案+最長上升子序列LIS+樹狀陣列,首先二分一個答案,然後算出它們經過t之後的位置,這時的相對位置的最長上升子序列如果大於k說明合法,否則不合法,這樣第一問就\(O(Nlog_2^2N)\),第二問:很容易證明這個轉移是滿足最優子結構性質的,於是可以抽象成一顆樹的結構.用樹狀陣列維護字首的最大值的字典序最小的位置(有用的決策).滿足在樹上的深度最大,要比較字典序,只要找到兩個轉移節點的到它們lca的最小值即可(以上的部分是公共的),倍增跳就可以了.

10.20 DAY4 wxh

暴零了...