1. 程式人生 > >2018/3/13

2018/3/13

情況 然而 com 插入 含義 OS 總結 合並 imp

  沒有題解的考試

  標程1k我卻只能改5k+的改法

T1 simple

  我好像遇到最長上升子序列的題就做不出來,上回在成都就是一道非常顯然的上升子序列的部分分,然而我就是沒有看出來,這次又是,開始一個小時,根本沒有什麽正經的思路,一直在搞什麽逆序對,發現了一堆奇奇怪怪的性質,但是沒什麽卵用,直到我把別的題的暴力都敲完了,回來一看,才猛然發現鏈的情況是最長上升子序列,並且可以拓展到樹上進行DP,然後搞到了40分,然後鏈的情況我還覺得可能是根有兩個兒子,就算是這樣,也是這敲一下啊,反正又不難打,然後40分的暴力,因為最後離散後沒有把權值的最大值給改過來,又丟掉了20分。。。。。 感覺這是考試以來,做得最不爽的一道題

  但是我們的大猩猩現場就A了,他的做法就是把DP的過程優化成在線段樹上搞,可以發現,在原來的f數組中,有實際貢獻,也就是實際存在的j就是這可子樹裏存在過的權值,那麽我們可以直接對於每一個節點開一個權值線段樹,對應的權值就是原來f數組中的值,但是合並兒子的時候,並不能讓對應節點簡單的相加,因為兩個兒子中,不同的j也會有產生更優的貢獻,比如說,1號兒子有一個4的小根堆,那麽他完全可以直接的加到2號兒子的3的小根堆中,所以我們考慮一個點,會對另一個子樹中的哪些點產生貢獻,首先,如果j<k並且f[i][j]<f[i][k],那麽k就會比j更優,所以j對另一顆子樹裏的貢獻會被j所覆蓋,所以在線段樹裏維護一下然f是單調遞減就好了,然後在合並的時候采用啟發式合並,把小的線段樹直接拍成一個數組,然後就先查一下每一個點在大線段樹中的後繼,因為這個別的子樹中對他的最優貢獻(單調性)那麽記錄一下這個值,這個是這個點被別的子樹更新過的結果,然後在對大線段樹中他能貢獻的點區間加一發,就完成了兒子之間的合並,因為每一個兒子的線段樹都是單調的,所以兒子合並之後依然是單調的,然後考慮加入當前的根的貢獻,就是從所有兒子合成的大線段樹中,查他的後繼,然後+1就是這個根的最優貢獻,但是由於這個根的+1操作,在把他插入到線段樹中的時候,就可能造成線段樹的不單調,就不斷的查他的前驅,比他小就刪掉,這樣因為每一個點最多會被刪掉一次,所以復雜度也是有保證的,然後這麽搞下去就好了。。。。

  然後線段樹裏查前驅後繼的話,如果要查x的後繼,就先走到x所在的位置,然後在遞歸回來的時候,判斷右兒子是不是空,回來第一個不是空的右兒子就是後繼。

  正解的話就更NB了一些,我們想,如果兩棵線段樹裏存的值不進行區間加,查後繼更新這種操作的話,那麽一個點的f值實際上就是他所在線段樹的後綴和,那我們直接用一個 map 來實現存儲每一個點自己不更新的值,然後啟發式合並一發,最後遍歷一下 map 第一個點的後綴和就是答案了,那麽我們考慮一下map中每一個點的值的新含義,實際上就是它所代表的小根堆比他後繼所代表的小根堆中的點數多了多少,但是還有一個沒有解決的問題就是當把根這個點插入的時候,如何維護單調性,其實跟這個點的值直接++就好了,因為它比他後面的堆中多了一個點,但是這個根所在的點不能對它前面的點做出貢獻因為他是堆頂,但是由於我們維護的是一個後綴和,每一個點實際上就是上一個辦法中的線段樹中的每一個點與相鄰點的差分值,所以需要把他的前驅的值-- 來抵消掉它造成的影響,當他的前驅-- 之後變成了0那麽就意味著,這個點的前驅所代表的小根堆中的點和這個點的小根堆的點數是一樣的,那麽前驅就不優了刪掉就好了。

T2 trans

  這個題的話,模擬一下就是把每一個區間長度從小到大取max之後形成的新序列,有一個30分的部分分就是先考慮較小的那個數所存在的總區間長度,然後算出他的貢獻然後在用大的算整個區間的在減去小,在考慮一下首尾的特殊情況的就好了。。。。 正解也是類似的,就是把所有的點排序之後,從小到大,分為黑白兩種點,已插入的是白點,未插入的是黑點,然後在計算貢獻的時候,就是這一步所有區間的貢獻減去上一回的貢獻,這麽搞下去,然後也是註意一下不叫惡心的首尾情況。。 區間合並的話可以用鏈表,也可以用set

T3 mov

  50分的暴力還是很好拿的,正解就是小魔術就用盧卡斯,就是把每一個先有步轉換,把(x,y)變成((x+y)/2,(x-y)/2),這樣的話原來的移動對應到現在就是(x+1,y),(x,y+1),(x+1,y+1),然後設斜著走i步,A=(n+m)/2,B=(n-m)/2,那麽方案數就是C(A+B-i,A)*C(A,i),然後我們就把C上的四個數都變成P進制,然後數位DP,轉移求乘積就好了,但是值得註意的就是,如果(A+B)%p-i小於零了,那麽我們就是要從更高的位上借一位,然後DP的f數組多開一位記錄一下借位的情況就行了

  總結一下就是T1的懵逼導致後面的題做起來有些心理阻礙,做起來就沒有那種順暢的感覺,然後T1看出來是lis之後,打完想到了T2暴力之後也沒有什麽時間敲了,感覺最後一個小時直接就浪費掉了,T1的影響還是太大了,而且lis也並不難想麽,逆序對想不出來完全可以換一種思路麽。。。。。。。。。。。。

  T1還是挺令人印象深刻的。。。。。。。。。。。。

2018/3/13