1. 程式人生 > 其它 >test#2

test#2

8.16模擬賽(綜合2)


A.極源流體

不會。


B.等差數列

考點:數學

考慮列舉公差k,並列舉不變的數a[i]

此時確定了公差和序列中的一個數,整個序列就確定了。

檢驗序列是否合法:

  • 公差為負數:a[i]-(i-1)*k>0

    這樣可以保證能夠從a[1]a[i]之間每兩項之間的差不為負數。

  • 任意一項\leq\ w​​​​:a[i]+(n-i)*k\leq\ w

    保證序列裡最大的數\leq\ w

在確定k時,確定不同的k,也會唯一地確定了首項。所以將每個k下不同的a[i]​​對映到首項上。

如果兩個數a[i]a[j],對映到的首項相同,說明這兩個數可以同時存在於首項相同並且公差相同的序列也就是同一序列中。

因此,對於每個k​,統計被對映到最多的首項的數量,也就統計出來了最多可以存在於同一序列中的原序列中的數的數量,也就是最多不用修改的數的數量。

最後用n​減去這個數,也就是要求的最少的修改次數。

對於每個k進行類似的操作,每次都取min即可。


C.送給好友的禮物

考點:樹形dp

簡化問題,如果以一個點為根的子樹內不包含任何草莓節點,就把這棵樹刪除。

可以用dfs,如果需要刪除時,直接將e[i].to=0

這樣做顯然不會影響答案,而且所有葉子節點都是草莓節點。

轉化問題為:對於一棵樹,有兩個人同時從根去遍歷它,問整棵樹都被遍歷完且兩人最後回到根的最小時間是多少。

注意,求的是時間的最大值,所以應該是路徑長度取max,而不是求和。

dp[i][j]表示遍歷完i子樹,其中第一個人走了j步,第二個走的最少步數。

進行樹形揹包時,列舉第一個人在u子樹內走的步數i,分為三種情況。

  • 第一個人不進入v子樹,第二個人走完v子樹。

    dp[u][i]+dp[v][0]+2

  • 第一個人走完v子樹,第二個人不進入v子樹。

    dp[u][i-size[v]*2]+dp[v][(size[v]-1)*2]

  • 第一個人與第二個人共同走完v子樹。

    • 列舉第一個人在v子樹內走的步數

      dp[u][i]=dp[u][i-j-2]+dp[v][j]+2

code


D.非常困難的壓軸題

考點:字串

給出的資料範圍是個迷……

分別統計L的字首和與S的字尾和。

suml[i][1,i]L的個數,記sums[i][i,len]S的個數。

最後列舉每個位置i,如果位置i上的字母是W,那麼ans+=suml[i-1]*sums[i+1]

注意開longlong,能拿的分一定要拿。

code