Codeforces 补题记录
首先總結一下前段時間遇到過的一些有意思的題。
Round #474 (Div. 1 + Div. 2, combined)? ?Problem G
其實關鍵就是n這個數在排列中的位置。
這樣對于一個排列,設$f[pos] = p$, 那么從位置$1$到位置$pos$最大值被刷新了$a$次,從位置$n$到位置$pos$最大值被刷新了$b$次。
去掉$n$之后,剩下$n-1$個數被分成了兩個部分。
假設把這$n-1$個數分成$a+b-2$個組,分配給左邊$a-1$個組,給右邊$b-1$個組。
對于$n$左邊的數,每個組內部一定滿足第一個數最大,對于$n$右邊的數,每個組內部一定滿足最后一個數最大。
這樣就滿足了題意。
這樣其實就是一個環排列計數,具體一點,就是求$n-1$個數劃分成$a+b-2$個集合,每個集合內部再按特定順序圍圈分組的方法的數目。
這剛好是第一類斯特林數。那么答案為$C(a + b - 2, a - 1) *?S(n - 1, a + b - 2)$。
?
Round #480 Div2? Problem E
去掉$k$個點,相當于保留$n - k$個點,需要滿足剩下的$n - k$個點連通。轉化為保留$m$個點,求留下的點的權值和最大。
以$n$為根(必選),從$n - 1$開始往前選,假設當前已經選了$x$個點,如果當前點往上爬,爬到第一個已經被選的點時的移動距離大于$m - x$,
那么不能選這個點(因為選了一個點就必須選他的祖先),否則就選入這個點,然后選擇所有的他的祖先中未被選擇的點
(也是一步步往上爬,到發現了被選中的點為止),到選了$m$個點為止結束即可。
?
Round #482 (Div. 2) Problem D
預處理出所有數的因子。加入一個數的時候在以他的所有倍數為編號的字典樹中插入這個數,(字典樹編號最大為$100$)
查詢的時候如果$k$小等于$100$,那么在字典樹里查詢,否則直接暴力找。
?
Round #383 (Div. 1)? Problem D
首先預處理出$c[]$,$c[i]$表示$i$到根上所有邊的每個字母出現次數總和的奇偶性,狀態壓縮后用一個數表示。
如果滿足$c[x]$ ^ $c[y] = 1$,$x$到$y$的路徑上的所有字母重排后就可以組成一個回文串。
考慮dsu on the tree,對于每個點,求出$f[x]$:滿足$c[i] = x$的所有$i$的深度的最大值。
在遍歷輕兒子的所有后代的時候一邊更新最大值一邊刷新$f[]$就可以了,重兒子的方法類似。
?
Round #316 (Div. 2)? problem (E)
設$f(i, x1, y1, x2, y2)$表示A從左上角出發走了$i$步到達$(x1, y1)$,B從右下角出發走了$i$步到達$(x2, y2)$的方案數。
看似是$5$維的狀態,其實顯然可以轉化成$3$維,因為知道了$x1$就知道了$y1$,知道了$x2$就知道了$y2$。
枚舉$i$,每次$x1$和寫$x2$有一個特定的范圍,總狀態不是很多。用滾動數組可以把數組降到二維。
最后統計答案的時候判斷一下奇偶就可以了。
?
?
5.22
Round #483 Problem C
狀態表示$dp[i][now][a][b][c]$, $i$表示第$i$個人此時正在電梯里,前$i-1$個人要么正在電梯上,要么已經到達了目的地,$now$代表當前電梯正停在第$now$層,$a$, $b$, $c$代表正在電梯里的三個人的目的地。
?
記憶化搜索轉移即可。
?
5.28
Avito Code Challenge 2018 Problem E
考慮這樣一個事實,如果某個和能被表示出來,那么這個數就可以成為最大值。
那么線段樹上跑背包就可以了,用bitset優化。
時間復雜度$O(nqlogn / w)$
?
5.29
Edu Round 44 Problem G
考慮容斥。
首先不管沖突,計算答案,對于任意一個三元組,只要他是三元組就加到$ans0$。
然后對于任意一個三元組,如果他存在任意一條邊(每條都判),那么就加到$ans1$。
接著對于任意一個三元組,如果他存在兩條邊(每兩條都判一次),那么就加到$ans2$。
最后把所有三元環加到$ans3$.
這樣,對于任意一個三元組
如果他有$0$條邊,那么他被$ans0$計入了$1$次,最后計入了答案。
如果他有$1$條邊,那么他被$ans0$計入了入了$1$次,被$ans1$計入了$-1$次,最后對答案貢獻是$0$。
如果他有$2$條邊,那么他被$ans0$計入了入了$1$次,被$ans1$計入了$-2$次,被$ans2$計入了$1$次,最后對答案貢獻是$0$。
如果他有$3$條邊,那么他被$ans0$計入了入了$1$次,被$ans1$計入了$-3$次,被$ans2$計入了$3$次,被$ans3$計入了$-1$次,最后對答案貢獻是$0$。
那么就符合題意了。
?
Round 485 Div1? Problem C
暴力+記憶化搜索。
枚舉到一個集合的時候如果發現這個集合還沒標記過(也就是還沒連通過),那么累計答案。
然后就把跟這個集合可以連邊的所有點全部加入這個連通塊,具體操作是按位異或之后標記,并對所有子集標記
感覺還是挺考智商的一個題。
?
6.6
Round 485 Div1? Problem D
先快速冪求出$3^{x}$,滿足$4 * 3^{x} <= n$,然后逐漸逼近。
乘法的時候要用FFT優化,注意一些細節。
?
6.7
Round 429 Div1 Problem C
首先其實這是若干個連通塊的事情。
因為如果$a * b$和$b * c$都是完全平方數,那么$a * c$肯定是完全平方數。
所以這$3$個數兩兩都不能在一起。
然后就變成了HDU6116那個題。搞出卷積,然后暴力(甚至不用NTT)容斥就可以了。
?
6.8
用FFT匹配字符串的經典問題,就是加了一個門限值$K$
因為只有$4$個字符,所以提取出$4$個$01$序列。
把S串對應的$01$序列每個$1$位置前后$k$個都變成$1$,然后按照套路來就可以了。
?
6.9
Round 485 Div1 Problem E
首先$10^{7}$以內所有數最多只有$8$個質因子。
那么對每個數分解質因數,然后把詢問拆開來,對每個質因子獨立求解。
可以證明所有質因子要處理的信息的和不超過$nlogn$個。
把問題轉化為求某個點到根結點這條鏈上的$min(a[i], x)$的和。
于是就想到了排序,然后一個個加進樹狀數組。
維護兩個樹狀數組,每次把那些小于詢問的加到第一個,把那些已經大于詢問的從第二個減去。
(腦補一下這個過程)
至于樹狀數組怎么操作,回想一下差分的思想。
搞出dfs序之后如果要加上某個點的值,那么對這個點代表的dfs序區間差分一下,然后單點求值。
最后把詢問的答案整理一下就可以了。
?
6.13
最近的兩場比賽加起來掉了$160$多分……心累。
直接回藍名。
主要是后面的題不會,中間的題卡了太久,以及前面的題FST。
教育場就是教育場吧,前面后面的題權重都一樣,都是$1$
這教育場的G我怎么就去寫點分治了啊……完全沒必要的。
所以跳題是真的虧,這也說明了我垃圾的讀題能力。
div2最近加大了一些難度,個人覺得Round 487并不是一場很好的比賽,題目難度有點偏高了。
(以及有點毒瘤)
?
6.14-7.29
woc快兩個月了我一點都沒寫過。
慢慢填坑
EDU 45
F? 直接固定一棵生成樹然后dfs一遍就好了。
G 樹形DP一下就可以,沒必要點分治。注意兒子的信息用完之后得清空,不然會MLE
?
EDU 46
E 固定生成樹之后并查集(類似17沈陽網絡賽那個套路),求出每條邊的新權值
(如果是必經之路那么為$1$,否則為$0$)
然后求一下直徑就行了。
F 直接線段樹就好了。離線操作就行。
?
Round 488 Div 1 E
FFT裸題
?
Round 493 Div1
D
其實只要求出每棵樹的$dp[x][k]$就行,也就是從$x$出發走$k$步再回到$x$的方案數。
直接求顯然很難,考慮樹分治。
給每個點加一個強行必須經過的點,然后計算貢獻。
這樣在樹分治的過程中一個點的經過區域剛好被那些分治中心劃分成了最多$log$個區域
分治的時候DP兩個東西,一個是從分治中心出發經過$k$步最后到某個點的步數。
還有一個是從分治中心出發經過$k$步中途不能回來并且最后到某個點的方案數。
對當前子樹的某個點的答案貢獻就是$∑f[x][i] * g[x][k - i]$
也就是枚舉一個點經過了多少步第一次到達分治中心,然后在分治中心開始兜兜轉轉,
最后回到自己。
最后兩棵樹的答案求一下卷積和就行了。
?
Round 483 Div1 E
考慮每個點往上走一次路線最高能走到哪里。
然后倍增一下。
詢問的時候先跳到跳一步就能到LCA的那個位置,
記作$x$和$y$,先判斷能否到達。
然后討論一下,如果存在一條兩端分別在$x$子樹和$y$子樹里面
就可以直接到了,否則答案還要加$1$
這是一個二維數點問題,直接離線樹狀數組就可以了。
?
Round 439 Div 2 D
首先考慮哪些點要被考慮。
新加的邊兩端的點,這些點到根的所有點。
最多$240$個點,構成了一張新的無向圖。
每個點是帶權的,權值為這個點管轄的點數。
然后枚舉起點,搜索一下簡單路徑個數即可。
?
Avito Code Challenge 2018
G?動態開點線段樹跑一下就可以了。
?
Round 395 Div1 E
高中學弟上黃題!
回滾莫隊直接艸過去了……
?
轉載于:https://www.cnblogs.com/cxhscst2/p/9061855.html
總結
以上是生活随笔為你收集整理的Codeforces 补题记录的全部內容,希望文章能夠幫你解決所遇到的問題。