ByteDance - Moscow Workshops ICPC Programming Camp 2019. Day 5, Div A.
A B CDEF GHI
覆盤人:fz
開場xjb看題,B,D都不太會。發現F只需要求四元環,但是不會,暫時擱置.
有人過A,看A感覺非常可做,想了一個貪心,和R爺討論了一下以後R爺上機.
0:53,A AC(+1)。
有人過B,G,葉隊表示G可以二維凸包,瞬間被Check it out秒叉(?).然後葉隊上機,寫了一會之後感覺沒啥希望就下機了.
中期BFI三題同開,到2.5h時大約有了I的做法.阿爺寫完了之後交了一發TLE on 4.底下測資料發現n=1000跑不出.
此時發現I的做法大概有問題(後來發現是沒有問題的,複雜度多了一個log),改成直接在dfn序上二分.然後B也推出了3^Q*Q的弟弟做法.
4:08,I AC(+1)。
4:12,B AC(+1)。
最後40min我開始寫F除了四元環以外的部分,葉隊搞4元環.20分鐘以後寫完其他部分然後放棄了.R爺掙扎了一下H,發現做法有問題.就棄療了.
感覺這一場的策略沒有出什麼太大的問題(因為根本就沒有策略).唯一似乎能改進的地方就是在n=1000跑不出的時候如果能先看一下為什麼跑不出可能會更好一些.
A:考慮第一個人決策固定時第二個人肯定是每次在[1,n]都出現的時候放在最後一個上.於是可以先構造一個[1,n]的排列,然後之後每次可以去掉之前的最後一個數.
B:記f[i][j]表示選了i個等價類,當前選擇的集合為j的貢獻.那麼每次列舉一個子集計算貢獻轉移即可.複雜度O(3^n*n).
C:
D:
E:
F:一通容斥之後轉化為求三元環和四元環.考慮每個點出現在幾個四元環中。類比三元環的做法,在平行四邊形中,考慮列舉標號最大點的對頂點x,列舉x的無向出邊y,列舉y的有向出邊z.那麼(x,y,z)和(x,c,z)可以構成一個四邊形.時間複雜度O(M\sqrt N).
G:
H:
I:(1)考慮對所有葉子的dfn序做二分.可以注意到若將子樹按照size遞減排序,那麼每次二分出一個長度為n的合法區間,至少可以去掉n/2個葉子.於是總複雜度就是O(N log N)
(2)考慮對整棵樹做整體二分,一個點若合法,則其子樹都合法,否則它到根鏈上的點都不合法.可以注意到的是每個葉子至多會被訪問O(log N)次,總複雜度O(N \log N).