2018 牛客多校 2

2022-05-27 20:24:09 字數 1446 閱讀 3353

problem a

problem b

考慮第二種優惠,每乙個物品如果原價購買了,

那麼向可以免費拿的那個物品連一條邊(在樹上被指向的那個點是父親)

如果不考慮環的話,考慮樹上dp。

設$f[i][0]$表示買掉以$i$為根的子樹需要的最小花費,

設$f[i][0]$表示買掉以$i$為根的子樹並且$i$這個點是原價購買的最小花費。

那麼買掉$i$子樹的最小花費和為$f[i][1] - p[i]$,就可以轉移了。

分開考慮每個連通塊。

每個連通塊是乙個環的結構。

先用剛才樹dp的做法得到每個點的值,然後在環上dp。

具體一點,把環斷開來,列舉鏈頭是原價買的還是被鏈尾打包了。

然後就類似剛才的方法dp下去就可以了。

problem c

problem d

problem e

設$f[i][j]$為以$i$為根的子樹所有連通塊大小為$j$的權值和。

這是乙個可逆的dp。

把乙個點加到某個點的兒子集合中去,這個dp比較顯然,我只要合併兩個陣列就可以了。

這樣的話把乙個點從某個點的兒子集合中剝離出來,也是可以做到的。

操作$0$的話很簡單,從這個點到$10$級祖先乙個個剝離,然後更新這個點的陣列,

然後乙個個放回去就可以了。

操作$1$的話,從這個點到$10$級祖先乙個個剝離,

然後從這個點的父親開始乙個個放回去(這個點要給別人了)

然後被加的那邊也是類似的操作。

操作$2$也就是詢問很神奇。首先繼續從這個點到$10$級祖先乙個個剝離。

這個過程其實也可以看作是把$10$棵樹各自分離。

然後詢問的時候把當前點想象成根,把他的原來的祖先的陣列合併到他那裡

這樣處理就很方便,然後撤銷就可以了。

problem f

problem g

problem h

problem i

模擬,考慮兩條對角線控制的$8$個點,這$8$個點為$1$組,然後討論下取個最大值就可以了。

problem j

比賽的話也只能靠做做這種題活命了……

給每個點賦乙個比較大的數,如果乙個點被操作了$x$次,並且被操作的數都是這個點的權值本身$y$的話。

那麼我們可以給他計算一下在他身上操作過的數的和。

最後如果等於$xy$,那麼就活著。

那麼問題轉化成了二維字首和,就可以做了。

problem k

首先行和列是可以分開考慮的。

對於每一行,求出這一行的迴圈節可以是哪些數。

這個雜湊搞一下就可以了。

這個迴圈節跟平時的不太一樣,

意思是如果複製無限次後能覆蓋當前整行就行。

顯然如果乙個數可以作為所有行的迴圈節,那麼這個數就可以作為矩陣的長。

那麼列這邊也是同樣的道理。

最後求一下子矩陣最大值的最小值,滑動視窗就行。

2018牛客多校3

h diff prime pairs 1 3 1 5 1 7 1 11.2 3 2 5 2 7 2 11.3 3 3 5 3 7 3 11.4 3 4 5 4 7 4 11.打個素數表 用素數篩一遍 includeusing namespace std bool a 11111111 int zs ...

牛客多校2018四 A

很顯然地發現對於某個位置的乙個1或2,它對答案的貢獻與之前進行了多少秒有關,所以趕緊打個表看一看,就發現對於某乙個1來說,它對答案的貢獻就是 t 2 2 t是之前經過的時間,對於2的情況,打出假設輸入的數列是 2 02 002 0002 的表,就發現答案分別是3,9,21,45,93 對這個答案數列...

2018牛客多校7

有點難度啊。a minimum cost perfect matching 隊友搞的 應該不難 把二進位制寫出來看看 includeusing namespace std define ll long long int define lson rt 1,l,m define rson rt 1 1,...