這段時間爲了準備冬令營把清北冬令營真題都作了一下。更個博回顧一下(省得大家老說我咕咕咕)。
先寫良心PKU的題再寫THU的題,
主要是THU的題和PKU比起來真的毒瘤好多......算法
一個比較顯然的暴力是歸併排序,每次直接先後綴計算答案便可。
爲啥不用線段樹合併代替歸併排序呢?
暴力線段樹合併,合併的過程當中順便算一下便可,因爲權值區間不交因此複雜度一個\(log\)。函數
順着題意模擬便可。
強化牌的數值都大於\(1\)意味着多打一張攻擊牌不如的多打一張強化牌。
枚舉抽中了幾張強化牌,當強化牌數量小於\(K\)時,必定是用全部強化牌加上最大的幾張攻擊牌,
當強化牌數量大於等於\(K\)時,爲前\(K-1\)大的強化牌加上最大的攻擊牌。
把攻擊牌與強化牌按照價值從大往小排序,先算總和最後除方案算機率,隨便dp一下就好了。優化
九老師:這是我能想到的最好的模擬題了!然而現場無一人得分......我選擇死亡。spa
這個題仍是有點意思。
\(n\leq 20\)確定是狀壓DP,很天然想到直接狀壓已經被\(Ban\)掉的點有哪些。
怎麼轉移?
把視野放大,考慮全局合法排列的生成,枚舉加入最大獨立集的點是哪一個,
而後把這個點放到第一個空缺的位置,再把與之相鄰點放到後面的任意位置(選對應個空位)。
顯然轉移過程當中咱們保證了獨立集的點之間順序,因此計數是不重不漏的。
至於要同時求最大值與方案數,兩個一塊兒DP,維護一下便可。排序
很明顯的終止態容斥問題了,枚舉誰在\(1\)號獵人後面死,那麼剩下的獵人就不用管了。
還有一個問題就是打到了死的獵人怎麼辦,
這裏比較妙,咱們能夠認爲打到了死的看成鞭屍,再打一次直到打到一個活着的獵人。
根據賭徒輸光那套理論,新舊問題顯然等價。
列出式子,無窮級數化簡後發現容斥係數只與\(w\)之和有關,用分治\(FFT\)就能夠計算。遊戲
使用\(min-max\)容斥轉爲求任意一個點被到達的指望步數。
這是經典問題,狀壓DP後樹上高斯消元解決。字符串
來搞笑的吧?討論一下兩個組合數一加就沒了。(放普及組T2挺合適的)數學
一個比較天然的想法:把最大前綴和拆分紅兩段,前面是最大前綴,後面的每個前綴都小於\(0\)。
這樣算答案只須要枚舉前綴是什麼,
後面的部分很好求,設\(g\)如上述,狀壓DP每次向後插入一個元素時\(check\)一下就能轉移。
關於前面部分:設\(f_T\)表示包含\(T\)集合元素,且最大極長前綴和等於全集和的方案數。
智障選手:容斥減去不合法的,發現不合法部分爲\(f\)和\(g\)的卷積,暴力子集卷積。(顯然過不了)。
高智商選手:把向後插入改成向前插入,那麼只要保證插入前這個後綴非正,能夠很方便的轉移。
講真這題真的有驚豔到我。it
很差意思,這題咕了。io
首先能夠注意到最多隻會向後跳一次,由於跳兩次再跳回去絕對沒有意義。
其次,因爲上述性質,從後面的點跳到前面的點後,前面的點再日後跳也絕對沒有意義。
由於若是它後跳後再往前跳一大步,那麼它日後跳到的那個點必定能夠經過它的來源點直接到達。
而後就能夠倍增了,設\(f_{i,j}\)表示\([i,n]\)中的點向左跳\(2^j\)可達的最左位置(向右跳無論)。
爲了算答案同時記\(g_{i,j}\)表示從\(i\)點出發,跳到\([f_{i,j},i)\)這些位置所須要的步數和。
首先\(f\)的轉移顯然,\(g\)的轉移:\(g_{i,j} = g_{i,j-1} + g_{f_{i,j-1},j-1} + 2^{j-1}(f_{i,j-1} - f_{i,j})\)。
算答案時,把答案轉爲後綴相減形式,倍增處理,
爲了減小特判,先把起點\(i\)移到\(l_i\),最後再全局加上一步(第一步不管左跳仍是右跳代價都爲1)。
長爲\(i\)的\(Border\)存在的條件:不存在\(d\),知足\((n-i)|d\),且\(s_j \neq s_{j+d}\)。
問題變爲判斷\(s_j \neq s_{j+d}\)的存在性,字符集很小,枚舉字符用\(FFT\)作匹配便可。
預處理圓被多邊形包含的最小半徑。
若不包含,求交點後極角排序,對於一段弧,用轉角公式求中點,而後判中點是否在多邊形內。
因爲數據範圍很小,因此上述過程所有直接暴力就好了。卡精度警告。
建一個Trie樹,因爲字符串很短因此每一個點開個vector暴力存每一個時間的最先出現便可。
查答案時作匹配到對應結點,而後直接查vector就好了。
設\(g_{l,r,x,y}\)表示區間\([l,r]\)最後一次消除的最大、最小值分別爲\(x,y\)的最優方案。
設\(f_{l,r}\)表示把區間\([l,r]\)消完的最優方案。
那麼顯然\(f_{l,r} = min(f_{l,r} + g_{t+1,r,x,y} + A + B(x-y)^2)\),即枚舉最後一段在哪裏。
關於\(g_{l,r,x,y}\),咱們關鍵在於記錄了最後一次消除的信息(從而實現了跨多段消除)。
連續轉移:\(g_{l,r,x,y} \to g_{l,r+1,max(x,w_{r+1}),min(y,w_{r+1})}\)。
跨段轉移:\(g_{l,r,x,y} + f_{r + 1 , t} \to g_{l,t,x,y}\)。複雜度\(O(n^5)\)鬆一鬆就過去了。
不是很會啊......會的大佬教教我唄......
把三個函數黴黴展開,而後發現其導數都是循環的。
由於有斷邊刪邊操做,因此用\(LCT\)暴力維護一下路徑係數和就好了。
關於只有\(t=0\)的數據,其答案總和就是一個二分圖計數,暴力狀壓這樣就有\(40\)分了。
關於\(t=1,t=2\),只能說陳老師真的神了......
考慮暴力,設\(f_{S,T}\)表示左半邊匹配上集合爲\(S\),右半邊匹配上集合爲\(T\)的指望條數。
注意到\(S\),\(T\)的\(bit.count\)時刻相同,暴力搜一下能夠發現合法狀態其實並很少,因此用\(map\)記搜。
在記搜的每一層,首先找到最小的未匹配點\(u\),而後進行決策。
對於\(t=0\)的邊\((u,v)\),顯然直接加入:\(f_{S,T} = f_{S,T} + \frac{1}{2}f_{S+u,T+v}\) 。
對於\(t=1\)、\(t=2\)的邊,考率把它拆分紅兩條\(t=0\)的邊,而後跟上面同樣的作。
但這樣答案確定不對,考慮一下答案的偏轉量,咱們手動修正一下。
對於\(t=1\)的邊,
若只有一條邊在匹配中,機率爲\(50\%\),正確。若都不在匹配中,無影響無論。
若兩條邊同時出如今匹配中,此時機率爲\(25\%\)不對,因此須要額外添加\(25\%\)的機率進行修正。
對於\(t=2\)的邊,
若只有一條邊在匹配中,機率爲\(50\%\),正確。若都不在匹配中,無影響無論。
若兩條邊同時出如今匹配中,此時機率爲\(25\%\)非法,因此須要額外減小\(25\%\)的機率進行修正。
關於點\(1\),爆搜便可。
關於點\(2\),拿點\(1\)的爆搜程序跑上個十幾分鍾就能跑出來。
關於點\(3\),裸揹包直接作。
關於點\(4,5\),每一個抽屜的容積同樣,因此就是二分圖最大權匹配,\(KM\)便可。
關於點\(6\),抽屜的容積差別幾乎沒有,因此依舊跑二分圖最大權匹配就能得解。
關於點\(7\),發現只有第一根蘿蔔比較詭異,暴力枚舉一下它放哪裏,剩下的依舊\(KM\)解決。
關於點\(8,9,10\),退火隨機化,至於能有多少分看臉。
看到\(K\)那麼小顯然枚舉一下巧克力集合,
而後若是無論第二問那麼問題變爲了關鍵點生成樹,用斯坦那樹搞搞這樣就有\(56\)分了。
關於第二問其實也是一個現套路。
二分中位數,把小於等於\(mid\)的點設爲\(-1\),大於\(mid\)的點設爲\(1\)。
那麼咱們但願在點數最少的前提下,上述權值也最小,故只須要把點數的權值設的很大就好了。
最後一個問題在於巧克力種類不少的時候怎麼辦。
把巧克力種類隨機映射到\([1,K]\)而後多作幾回上述算法,聽說能夠證實這樣正確率高達\(99\%\)。
問題轉化每給定一個集合,求知足異或後每一位爲\(0\)的子集個數。
一種\(50\)分:按照大於\(\sqrt{MaxR}\)的質因子分組,把其餘質因子暴力狀壓\(DP\)。
另外一種\(50\)分:子集異或爲\(0\)顯然可使用線性基高斯消元,最後\(2\)的自由元個數次冪即答案。
結合一下就有\(80\)分:
線性基中不保存大於\(\sqrt{MaxR}\)的質因子的基,分組後外部消一下這一位而後再插入到線性基中。
再結合一個結論:當區間大於\(6000\)時,答案即區間內出現的質因子個數。
而後就可以\(AC\)辣!是否是很棒?
顯然是個二分圖最大權匹配問題,裸跑\(KM\)白送\(70\)分不謝。
考慮優化建圖。
顯然每張桌子的位置之間能夠順次連邊,這樣每一個點就只用向可達桌子的對應位置連邊了。
然而這仍是隻有\(70\)分。
如今的問題主要在於桌子與桌子之間的連邊,考慮線段樹優化。
對於\(m\)個位置分別開兩棵線段樹,分別表示向左走和向右走,每次移向子樹時加上對應距離便可。
若是把三個元素當作向量的話(後面再加一個區間長度),
那麼不難發現每種修改對應乘上一個矩陣,而矩陣又有乘法結合率,因此用線段樹維護。
看到環先套一個\(Polya\),問題轉化爲求大小爲\(n\)的合法環的方案數(不考慮同構)。
考慮暴力怎麼作,咱們的難點在於要保證首尾合法。
能夠這樣:暴力壓\(m^{m-1}\)種狀態(最靠前的一個點能夠不計),而後把轉移矩陣當作臨接矩陣。
這樣咱們只須要保證轉移若干次後回到本身便可。
當\(m>5\)時,矩陣過大顯然會\(TLE\)。
咱們本地暴力\(DP\)(方法跟上面同樣,只是暴力轉移不要構矩陣)把每個\(m\)的前\(1000\)項跑出來。
把這些數據扔到\(BM\)裏去,發現居然存在遞推式!(當\(m=7\)時,遞推式長度達到最大爲\(410\))。
而後暴力\(Polya\),內部算方案直接用遞推式,矩乘依舊沒法經過此題因此須要使用\(CH\)線性遞推。
\(K=2\)求兩個圓的公切線便可,注意由於不保證相離,且半徑可能爲\(0\)因此須要特判一堆東西。
根據題目定義,超平面點集到兩個點\(S(s_1,s_2...s_K)\)、\(T(t_1,t_2...t_K)\)的距離相等。
不可貴到:\(\sum_{i=1}^K (s_i^2-t_i^2) = \sum_{i=1}^{K}2(s_i - t_i)x_i\)。
因爲\(S\)、\(T\)不定因此形式化的能夠寫成:\(\sum_{i=1}^K a_i x_i = d\) 。
由點到超平面的距離公式:\(dis = \frac{|\sum_{i=1}^K a_ix_i - d|}{\sqrt{\sum_{i=1}^K a_i^2}}\),不妨設\(\sum_{i=1}^K a_i^2 = 1\) 。
那麼對於每一個圓\(p\),有方程:\(|\sum_{i=1}^K a_i x_{p,i} - d| = r_p\)。
咱們暴力枚舉每一個圓的絕對值狀況,而後把\(a_i\)寫成\(k_1d + k_2\)形式,帶入\(\sum_{i=1}^K a_i^2 = 1\)就能得解。
這樣咱們就能夠求得所需的超平面了。
而已知(百度來的)超平面的法向量就是定義中的\((a_1,a_2...a_K)\),因此天然就能夠求切點了。