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,...