Codeforces

瑞雪兆丰年`發表於2024-07-21

Round 959

A

給定 \(n*m\) 陣列 \(a\),$ 1\le a_i\le n*m$ 並且兩兩不同,問是否存在陣列 \(b\),也使用這些元素,並且每個位置的值都與 \(a\) 不同。

\(1*1\) 陣列特判,其他迴圈移位。

B

給定01串s和t,可以對s任意次執行以下操作:選擇l, r,將l,r異或等長字首,問s和t是否能相等

對於s和t第一個不同的位置,看是否在這及這個位置之前出現過1,出現就可以隨便修改,因為0不會影響異或結果,可以一直用這單獨的出現1去操作s字串

C

給定一個陣列和一個值x,問有多少個區間滿足:起始為0,從l,r每過一個位置加上這個值,若加上這個值後大於x就歸0,最後結果不為0的區間。

字首和處理,從後往前dp,找到每一個位置比他大x值的位置,這個點的dp值就等於那個點的dp值加一。最後用所有可能減去所有dp值即可。(dp值其實就是以這個點為左端點不能選的右端點)

D

給定一個陣列a,長度為n,進行 \(n-1\) 次操作,對於第x次操作,可以選擇 \(|a_u-a_v|\) 整除x的兩個點建邊,問最後能否建為連通圖

對於第x次操作,一定有x+1個塊需要連線,考慮對x取餘值相等的兩個點可以建邊,根據鴿巢原理,x+1個塊放到x個餘數裡,一定會有兩個數相等,所以x從大到小倒序建邊,之後反轉輸出即可。

E

給定n顆有根樹,每次可以刪除一個樹的一個子樹,並將結果或上刪去的點數,問結果最大為多少。

首先對於任意個樹進行或運算,都不會大於這些數的和。並且對於每顆數,我們可以一直只刪一個節點來獲得自己所需要的值。所以貪心的考慮對於n個樹的大小,從高到低每一位進行判斷,這一位為1且答案這一位為0就或上這個樹,答案這一位為0,就把所有更低位或上1,就能獲得最大值。