csp-s模擬測試59 2019-10-04算法
又是快樂的吃*的一天數組
沒有藉口,調不出來,就是菜。函數
垃圾又頭鐵。測試
奇偶性質很顯然,建邊須要優化也很顯然。優化
大佬都會線段樹優化建邊,我只能用垃圾$set$,$md$我什麼腦子要左右分開跑??ui
處理出左右端點,把迭代器$++$移動。spa
這個過程在$Bfs$中作。3d
csp-s模擬測試58 2019-10-03blog
掛了$120$,男受。排序
沒本事的垃圾就不要作$T3$了,把**$T1$,$T2$作好就完了。(自黑 $Rp++$
$T2$沒打同一個時刻選擇不少件。
把時間離散一下就$A$了。
$T3$邊的數組沒開二倍(來自剛剛開始玩前向星的$vector$玩家的怨念……
水題,過了。
也是水題,這種揹包作過兩次了。(可是我不會$01$揹包就很難受了
把時間離散就能夠打普通$DP$了(無腦
還有之後不要再拿錯的數據用錯的暴力拍錯的「正解」了!!
題比較簡單,把長龜揹包的數組下標換一下就行了。
可是查詢須要優化。
咱們發現對於一個時間$t$價值和代價正相關。
因此把詢問離線,按$t$爲第一關鍵字排序,$M$爲第二關鍵字排序,根據單調性,最差複雜度爲$O(n^3)$,最優性和詢問次數無關。
咕咕咕
csp-s模擬測試56 2019-10-02
其實和預估分差$8$分,T1原本能夠作掉的,可是忘了$nth$ _ $element$怎麼拼了,因此這就是我考場玩(tui)了半個小時$Qt$的緣由。
$T2$打的真爽,正解挺好想的,就是暴力打錯還一直在對拍????,w tm拿正解調了半年暴力???(最後知道真相的我眼淚落下來
此次依舊放了對拍噁心身邊人。($kxkx$可是好像Moudingggggggggg心態很穩QAQ。
$T3$暴力都沒打,太菜了。。。。
二分。$0$的時候特判一下。
修改操做其實只對那一棵子樹產生影響。
很天然就能想到求出$dfs$序,再用樹狀數組單點查詢,區間修改維護。
注意對兒子和孫子或者說深度奇偶產生的影響是不同的。
我打的比較不同,我用了好多樹狀數組,對於根$1$和他的直接兒子各開一個來支持以上不一樣影響。
還從新對深度奇偶建了新的圖跑的$dfs$序。
具體實現的話,顯然內存很差控制。
把樹狀數組的數組開成$vector$再$resize$就能夠保證內存了。
其實這個題你們都應該能想到正解(可是要有耐心實現啊
咕咕咕
csp-s模擬測試(b) 2019-10-01
國慶信心賽,沒有反思,沒有題解。
其實仍是有一點的。
就是對拍要謹慎,否則會把身邊的同志心態搞炸。。。。
csp-s模擬測試55 2019-09-29
$T1$,$T2$都是正解,都由於沒有底氣棄掉了。
考場上$T1$把本身折磨死,一直調不出來,就打了全部部分分($woc$尚未我樹狀數組水不過的部分分
水題,正解很好想,由於有$xor$,因此維護最左端的$0$和$1$就行了。
有信心有耐心$==ac$。
水題,枚舉公共物品的思路很顯然,考場上沒時間了只能暴力維護。
打了一個$vis$標記,本質上是正解增增刪刪的思路,可是沒時間,最後打掛了。
能夠用動態開點,再根據狀況刪點增點,維護前綴和和個數就行了。
不會,待填。
csp-s模擬測試54 2019-09-28
$T1$正解了,$T2$的記憶化打掛了,丟了$51$,就只改了一個判斷位置,$T3$部分分也掛了,$-$打成了$+$,丟$14$。
之後要認真點啊,雖然這場感受很好,算下來仍是丟了很多。
水題,顯然若是兩個數$a$,$b$同時是一個數$x$的質因子的話,全部含有$a$或$b$的數都要放在一個集合裏。因此使用並查集。加上全是$1$的部分分提示,很天然想到$2^n-2$。
挺好的一道題。考場的記憶化暴力能夠水到不少分。
正解是$bitset$,$STL$玩家表示很好$van$。
還有一個新思想(其實也不新,雙向$BFS$),$meet int the middle$。
咱們表示一下對於某個點$x$,是否存在一個狀態$S$,能夠用$bitset$將點合併,用$meet int the middle$思路優化狀態數。
倒序枚舉點$x$的話最後就獲得了關於$x$的存在狀態$g$,配合$f$數組能夠合併狀態。
大概思路有了,實現起來有點困難,先咕咕咕。
csp-s模擬測試53 2019-09-27
csp-s模擬測試51(b) 2019-09-22
垃圾Smily都感受這b組題lj
T1 A了 T3原題(還更簡單了) md全場22我的A的T2********的我爆零了
****T2好水啊
****T1$Lca$調倆小時
****T3開$long double?????$
其實$T1$仍是很水了的,部分分的提示很明顯,就是公共$lca$,按着拓撲序加入新的樹
csp-s模擬測試50 2019-09-22
T1數組腦殘開小炸掉20,T2暴力達到標準暴力分,T3無腦$n^5$暴力拿到20(c n m 以暴力爲生
T2至今未改過來,(畢竟我是分塊控稍微抵制莫隊 可是優雅暴力一家親啊喂 據說莫隊都不用分塊的,先咕着明天改
主要是證實那個填平不會......
$f[i]$表示考慮到$i$而且$i$這個位置高度不變的最小代價
那麼轉移方程就很好寫了 $f[i]=\sum_{k=j+1}^{i-1}(t-h_k)^{2}+c*(h_j+h_i-2*t)+f[j]$
可是有一個細節 答案不是$f[n]$ 你須要在左右放上一個無限高的假想柱子 最後求$f[n+1]$
表示$i$從$j$轉移過來,咱們想什麼樣的$j$能夠轉移到$i$
必定是$j<=i$ 而且對於任意的$j+1<=k<=i-1$ 都有$h[k]<=h[i]$ $and$ $h[k]<=h[j]$
(顯然啊由於你要把 $i,j$ 之間的全都往上填
咱們再想 如何維護能夠轉移的 $j$ 的集合 咱們發現若是枚舉的話會使複雜度「優化」到$O(n^2)$
因而咱們頹完題解選擇了單調棧
想一想爲何要用單調棧
咱們維護一個單調遞減的單調棧 $l$,$j$,$k$是單調棧裏的元素(單調棧存原序列下標就好
那麼這個單調棧的實際含義爲 在$l$,$j$之間沒有比$h[l]$,$h[j]$大的元素
那麼意思就是你的 $l$,$j$能夠轉移給$i$
而且當$i$入棧 它頂掉的(如本圖中的$j$,$k$)必定不會轉移給$i$後面的元素
其實很顯然 記$i$後有一個$r$須要被更新 記轉移點爲$pos$那麼必須知足上文說的
在$l$,$j$之間沒有比$h[l]$,$h[j]$大的元素
在這兒也同理 在$pos$,$r$之間也不該該有比$h[pos]$,$h[r]$大的元素
那麼咱們想 被$i$頂掉的$k$顯然不可能做爲轉移點 由於$k$和$r$之間有一個$i$使得$k$不可能做爲$pos$
這是單調棧的優秀性和正確性(刪除了不必的轉移點,而且刪除的操做是對的
單調棧維護的轉移點討論完了,咱們思考轉移
咱們想應該怎麼轉移 以一個$j$轉移給$i$爲例
咱們要作的 是把$j+1$到$i-1$之間的填平
想數組含義 這必定是$j$,$i$不動 那麼就能夠代價分爲到達 $j$且$j$不動的最小代價$f[j]$和填平$j+1$到$i-1$的代價
即轉移方程的由來 $f[i]=\sum_{k=j+1}^{i-1}(t-h_k)^{2}+c*(h_j+h_i-2*t)+f[j]$
如今咱們要作的是求一個$t$使結果最優 顯然是一個二次函數的形式
假設咱們擁有了二次函數的最低點對應的$t$
咱們想即使是高考數學上你也要保證自變量$t$符合實際狀況
那麼咱們的$t$呢
必定要比$h[i]$,$h[j]$小 而且比$max(h[k])$,$j+1<=k<=i-1$大
即對於求出來的最優(不必定符合實際)的$t$設限制
顯然最後對於$h[i]$,$h[j]$取$min$,對於$max(h[k])$取$max$就好
$h[i]$,$h[j]$已知,那$max(h[k])$呢?
想一想單調棧 記棧頂爲$top$
顯然$i$和$top-1$之間的最大值是$h[top]$
因此能夠每次在彈棧前進行修改
以$top-1$爲$j$,$h[top]$爲$max(h[k])$更新答案 而後把$top$彈走 這時咱們是不用考慮$top-1$的
關於$t$的求法 就是二次函數最低點$-b/2a$
把原始方程化爲$a*t^2+b*t+c$的形式 求出$t$ 並如上設限帶入求值就好
$t=-\tfrac{b}{2a}=\tfrac{\sum_{k=j+1}^{i-1}h_k+c}{(i-1-j)}$
注意邊界問題 在咱們假象的柱子上是不用付出代價的(好比你當前要轉移到$n+1$ 把以前的填爲$t$ 是不須要付出$(h[n+1]-t)*c$的代價的)
大致就是這樣 可是證實爲何是平的我只能YY
我正在打莫隊
我打完莫隊了
$O(n^5)$暴力有人聽嗎?
我打的是錯解我非人
首先找出直徑,若是直徑惟一的話,那條斷邊必定在直徑上選。
由於你選擇其餘邊的話 直徑仍是作了最大的負貢獻
好由於測試點太水咱們就快樂的選擇不打正解利用了這個性質
(至於爲何會只有一條直徑,多是良(×)心(×)出題人的特殊數據,若是有兩條的話好像第三問就沒有意義了,意思就是他爲了防止被人水掉第三問的分而白白送了咱們$50$分 $QwQ$)
因此咱們枚舉直徑上的邊 斷成兩坨子樹 在兩坨子樹裏求子樹直徑
那麼對於這種斷邊狀況 它的候選答案$tmp$是$max((len_x/2+len_y/2+1),len_x,len_y)$
而後在用$tmp$更新$ans$ $ans=min(ans,tmp)$
想一想Dp求樹的直徑的數組定義 是否是表示到達這個節點後的最長長度?(就是$ans$一直取$max$的操做
可是它是對於整棵樹說的 咱們要的是針對一棵子樹 不能直接搬用 $Dp$須要略改一手 再也不贅述
因此能夠正反兩遍$dfs$ 求出前綴直徑 和 後綴直徑
再在直徑上枚舉更新答案 第一二問就快樂的作了出來
第三問也簡單 (先咕着
我又來更了......
其實也沒啥了,個人$sb$算法.....
第二問求出來能夠幹掉哪條邊,就直接從裏邊隨便拿一條,斷掉,記錄端點爲$st$和$ed$,用$st$和$ed$分別再跑樹的直徑,而後分別把以$st$和$ed$爲根的各自的直徑上的點集處理出來,再各自取點集中點輸出就好。